OpenCV使用像素值显示图像仅出现1/3画面问题求助
问题原因
imread接口默认采用IMREAD_COLOR模式读取图像,会将输入的图像转换为3通道BGR格式的Mat对象,类型为CV_8UC3,每个像素点对应3个连续的uchar类型数据,分别存储B、G、R三个通道的色值。
你遍历像素时使用image.at<uchar>(i,j)取值,每次仅读取1个uchar长度的内容,遍历总次数为image.rows * image.cols,仅覆盖了整张图像原始存储数据的前1/3,最终渲染出来自然只有原图像上1/3的内容。
解决方法
方案1:读取时直接加载为灰度图
如果你的业务仅需要处理灰度信息,读取图像时直接指定灰度读取模式即可,此时得到的Mat为单通道CV_8UC1类型,原有遍历逻辑无需修改:
// 第二个参数指定灰度读取模式,直接生成单通道灰度图 Mat image = imread("cameraman.jpg", IMREAD_GRAYSCALE);
如果使用的是OpenCV 3.x及更早版本,对应常量为CV_LOAD_IMAGE_GRAYSCALE。
方案2:保留彩色读取模式,修改像素访问逻辑
如果需要保留原始彩色图像的信息,需要匹配三通道的像素类型访问,再计算灰度值即可:
for (int i = 0; i < image.rows; i++) { for (int j = 0; j < image.cols; j++) { // 三通道图像的单个像素类型为Vec3b,按顺序存储B、G、R三个通道的数值 Vec3b bgr_pixel = image.at<Vec3b>(i, j); // 按标准灰度转换公式计算灰度值,也可根据业务需求直接取单个通道的数值 double gray_val = bgr_pixel[0] * 0.114 + bgr_pixel[1] * 0.587 + bgr_pixel[2] * 0.299; placeGrayValue(gray_val); } }
内容的提问来源于stack exchange,提问作者rikitikitavi
相关产品推荐
相关产品推荐

