我使用以下代码从图片访问 [5x5] 块。但我得到一个 [15x5] 块,每个元素重复三次。任何人都可以在此代码中指出错误。 我在下面的链接中提出了一个关于如何访问元素的问题。 How to access first 5*5 block from an image in open cv?
for(int m=0;m<10;m++)
{
for(int n=0;n<90;n++)
{
int block_width = Ns;
int block_height = Ns;
int roi_origin_x = m;
int roi_origin_y = n;
cv::Rect roi(roi_origin_x, roi_origin_y, block_width, block_height);
cv::Mat region = obtained_mask(roi);
std::cout<< " region " <<region<< std::endl;
}
}
答案 0 :(得分:1)
它可能与您图像的RGB通道有关。
尝试以下方法:
int block_width = Ns;
int block_height = Ns;
for(int roi_origin_y=0; roi_origin_y<90; ++roi_origin_y)
{
for(int roi_origin_x=0; roi_origin_x<10; ++roi_origin_x)
{
if(roi_origin_y+block_width>=obtained_mask.rows || roi_origin_x+block_height>=obtained_mask.cols)
break;
cv::Mat region(block_height,block_width,obtained_mask.type());
for(int dy=0; dy<block_height; ++dy)
{
for(int dy=0; dy<block_height; ++dy)
{
for(int k=0; k<obtained_mask.channels(); ++k)
region(dy,obtained_mask.channels()*dx+k) = obtained_mask(roi_origin_y+dy,obtained_mask.channels()*(roi_origin_x+dx)+k);
}
}
// TODO: process NsxNs block stored in region
}
}
答案 1 :(得分:1)
您的图像似乎是灰度图像,并且您尝试将其作为RGB图像从文件加载。所以你在每个频道都有重复的强度值。 RGB中每个通道的相等值表示灰色(从白色到黑色,在RGB立方体的对角线上移动)。您可以使用region
将cvtColor
转换为灰度图像,也可以检索region
像素的第一个通道,这样可以减少处理周期时间。