【数字图像处理】关于处理灰度图像时总是处理不全的问题

今天在做练习的时候,突然发现自己写的灰度图像处理程序只能处理图片的一部分,百思不得其解。

先上练习代码:

	//打开指定路径下的图片
	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后,终于得到了正确的结果。

正确结果:


  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值