如果这样的问题已经得到解答,我会提前道歉。我添加过滤器的所有搜索都会导致如何添加狗脸。我不确定适当的术语是什么。
手机应用程序(例如Snapchat的文本覆盖或Android的QR代码程序)使用什么技术来“变暗”图像的某个部分?我想在OpenCV中替换此功能。是否可以用其他颜色做到这一点? (例如添加蓝色口音)
示例:Snapchat文本叠加
https://i.imgur.com/9NHfiBY.jpg
另一个例子:谷歌Allo QR码搜索
https://i.imgur.com/JnMzvWT.jpg
任何问题或意见将不胜感激
答案 0 :(得分:2)
一般情况: 可以通过加法/减法实现亮度的改变。 如果要使图像变亮,可以向图像的每个通道添加特定量(例如20)。另一种方法是变暗(减法)。
要使依赖像素变暗,您也可以使用分区。这是1.5的分区将如何改变图像:
另一种方法是使用Exponential Operator。该运算符获取每个通道的值,然后计算像素值。然后,通过查看最高值,然后通过255 /结果值计算比例因子,将结果值缩放回0-255范围(对于8位RGB)。
如果使用值>一,它会使图像变暗。这是因为
这里是一个图表,指数运算符将如何更改每个像素的值。如您所见,操作员的值大于1会使图像变暗(意味着通道将向较低的值移动),而低于0的值会将所有像素移向白色,从而增加亮度。
以下是使用值0.5应用运算符的示例图像,这意味着您将每个像素^ 0.5并将其缩放回0-255的范围:
对于值2,您会得到:
可悲的是,我无法帮助你,因为我不熟悉OpenCV,但它应该很容易实现自己。
关于着色的问题:是的,这也是可能的。您必须将每个像素的值移向相应的颜色,而不是向白色移动。我建议inform you about blending。
答案 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.
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!