今天在做练习的时候,突然发现自己写的灰度图像处理程序只能处理图片的一部分,百思不得其解。
先上练习代码:
//打开指定路径下的图片
Mat srcImg = imread("E:\\学习之路\\数字图像处理练习程序\\冈萨雷斯数字图像处理MATLAB版图片\\dipum_images_ch03\\Fig0310(a)(Moon Phobos).tif");
if(srcImg.empty())
{
cout << "打开图片错误" << endl;
}
//将原图像进行直方图均衡
Mat dstImg = HistogramEquilibrium(srcImg);
//显示原图像以及直方图均衡后的效果图
imshow("原图",srcImg);
imwrite("./src.jpg",srcImg);
imshow("直方图均衡效果图",dstImg);
//保存效果图
imwrite("./EffectImage.jpg",dstImg);
waitKey(0);
return 0;
原图像:
处理后图像:
后来翻了下别人的文章才发现,是因为自己在使用imread这个函数时,使用不当。
imread函数是opencv加载图片的函数,该函数有两个参数,第一个参数是图片保存路径,第二个参数是指定读取图片的方式。
enum
{
// 8bit, color or not
IMREAD_UNCHANGED =-1,
// 8bit, gray
IMREAD_GRAYSCALE =0,
// ?, color
IMREAD_COLOR =1,
// any depth, ?
IMREAD_ANYDEPTH =2,
// ?, any color
IMREAD_ANYCOLOR =4
};
从上面的枚举解释中可以看到,当第二个参数为0时,是以8位单通道(灰度图)方式加载图片;为1时,表示以8位,3通道(彩色图像)方式加载图片;为2时,表示以原图像深度(16位或32位,否则按8位),3通道方式加载图片;为4时,表示以8位,原图像通道数方式加载图片。
如果想载入最真实无损的原图像,可以使用 IMREAD_ANYDEPTH | IMREAD_ANYCOLOR 作为参数。
那么,问题就迎刃而解了,因为在使用imread函数时没有指定第二个参数,函数默认flag = 1(以3通道彩色图像方式加载),可是我的源图像是单通道的灰度图像,所以处理后的结果就只有源图像的1/3。
将参数修改为0后,终于得到了正确的结果。
正确结果: