【Emgu CV教程】4.2、无缝融合应用之IlluminationChange()函数去除高亮区域

上一篇讲的是ColorChange()函数,今天讲IlluminationChange()函数,它可以去除图片中的高亮区域。试想一下,下面是一张反光背心的夜间照片,反光条颜色特别亮,如果想只把反光的部分变暗一点,其余部分不变,这时候就可以用到IlluminationChange()函数进行处理。

函数的定义如下:

public static void IlluminationChange(
    IInputArray src, // 输入图像
    IInputArray mask, // 掩码图,单通道或者三通道都可以,非零部分不起作用
    IOutputArray dst,  // 输出图像
    float alpha = 0.2f, // 0 - 2之间,越大越接近原图细节
    float beta = 0.4f // 0 - 2之间,越大图片平滑越多
)

用起来的代码如下:

Mat tempMat = srcMat.Clone(); // 深拷贝
Mat dstMat = new Mat();
Mat mask = new Mat();
int threshold = 200; // 掩码图阈值,越大越能提取出高亮区域.
float alpha = 0.3; // alpha越大,越接近原图细节,0-2之间.
float beta = 1.9; // beta越大,图片平滑越多,0-2之间.
CvInvoke.CvtColor(tempMat, mask, ColorConversion.Bgr2Gray);
CvInvoke.Threshold(mask, mask, threshold, 255, ThresholdType.Binary);
CvInvoke.IlluminationChange(tempMat, mask, dstMat, alpha, beta);
CvInvoke.Imshow("Mask, " + mask.Size.ToString(), mask);
CvInvoke.Imshow("IlluminationChange image, " + dstMat.Size.ToString(), dstMat);

Threshold()这个函数已经讲过了,就是利用阈值,找到图片中白色的区域,代码中的阈值是200,也就是超过200的部分是变成纯白,其余部分是纯黑色,这就是一个mask掩码图。在原图中,只有掩码图里是白色的地方才会调整。alpha = 0.3,beta = 1.9,效果如下:

是不是明亮的部分已经不那么刺眼了,这个函数用起来很简单,一共就三个变量可以调整,要多照几张图片试一试。要选局部有高光、并且高光部分的物体还是有纹理的。我在网上找了半天才找到这个反光背心的照片,效果还不是那么明显。

原创不易,请勿抄袭。共同进步,相互学习。  

  • 20
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值