为图像添加变暗滤镜OpenCV

时间:2018-04-09 19:51:17

标签: opencv image-processing

如果这样的问题已经得到解答,我会提前道歉。我添加过滤器的所有搜索都会导致如何添加狗脸。我不确定适当的术语是什么。

手机应用程序(例如Snapchat的文本覆盖或Android的QR代码程序)使用什么技术来“变暗”图像的某个部分?我想在OpenCV中替换此功能。是否可以用其他颜色做到这一点? (例如添加蓝色口音)

示例:Snapchat文本叠加

https://i.imgur.com/9NHfiBY.jpg

另一个例子:谷歌Allo QR码搜索

https://i.imgur.com/JnMzvWT.jpg

任何问题或意见将不胜感激

2 个答案:

答案 0 :(得分:2)

一般情况: 可以通过加法/减法实现亮度的改变。 如果要使图像变亮,可以向图像的每个通道添加特定量(例如20)。另一种方法是变暗(减法)。

如果你从图像的每个频道中减去50,你会得到: Subtraction 50

要使依赖像素变暗,您也可以使用分区。这是1.5的分区将如何改变图像: Division

另一种方法是使用Exponential Operator。该运算符获取每个通道的值,然后计算像素值。然后,通过查看最高值,然后通过255 /结果值计算比例因子,将结果值缩放回0-255范围(对于8位RGB)。

如果使用值>一,它会使图像变暗。这是因为 这里是一个图表,指数运算符将如何更改每个像素的值。如您所见,操作员的值大于1会使图像变暗(意味着通道将向较低的值移动),而低于0的值会将所有像素移向白色,从而增加亮度。
Power Operator explanatory chart

以下是使用值0.5应用运算符的示例图像,这意味着您将每个像素^ 0.5并将其缩放回0-255的范围: Exponential Operator 0.5 对于值2,您会得到: Exponential Operator 2

可悲的是,我无法帮助你,因为我不熟悉OpenCV,但它应该很容易实现自己。

关于着色的问题:是的,这也是可能的。您必须将每个像素的值移向相应的颜色,而不是向白色移动。我建议inform you about blending

Original image taken from here

答案 1 :(得分:1)

Update: I was able to darken an image by blending an image matrix with a black matrix. After that, it was just a matter of darkening certain parts of the image to replicate an overlay.

The lower the alpha value is, the darker the image.

Result

void ApplyFilter(cv::Mat &inFrame, cv::Mat &outFrame, double alpha)
{
    cv::Mat black = cv::Mat(inFrame.rows, inFrame.cols, inFrame.type(), 0.0);
    double beta = (1.0 - alpha);
    cv::addWeighted(inFrame, alpha, black, beta, 0.0, outFrame);
}

https://docs.opencv.org/2.4/doc/tutorials/core/adding_images/adding_images.html

Thank you for the help everyone!