我正在尝试使用此代码遍历cv :: Mat图像的像素
for (int i = 0; i < src.rows;i++)
{
for (int j = 0; j < src.cols;j++)
{
int temp2=IMAGE.at<uchar>(i,j)+b;
if (temp2<0)
{
IMAGE.at<uchar>(i,j) = 0;
}
else if (temp2>255)
{
IMAGE.at<uchar>(i,j) = 255;
}
else
{
IMAGE.at<uchar>(i,j) = temp2;
}
}
}
问题是当我显示IMAGE时,它仅调整图像大约1/4的像素值,因此似乎没有遍历每个像素。是否有更好的方法使用行/列遍历每个像素?
答案 0 :(得分:0)
循环浏览行/列应该可以,但是似乎您要处理的图像的像素大小为4字节,而您的代码假定为1字节(uchar)。这可以解释为什么您仅调整图像的1/4。您可以尝试使用cv :: Vec4b代替uchar(也许是CV_32SC1(int))。这两个像素的大小均为4字节而不是1字节。如果图像像素指定红色,绿色,蓝色,alpha和CV_32SC1用于32位灰度,则应使用cv :: Vec4b。
示例:
// RGBA
cv::Vev4b temp2 = IMAGE.at<cv::Vec4b>(i,j);
temp2[0] += b;
temp2[1] += b;
temp2[2] += b;
或
// 32 Bit Grayscale
int temp2 = IMAGE.at<int>(i,j) + b;