OpenCV 将我自己的滤镜应用于彩色图像

Posted

技术标签:

【中文标题】OpenCV 将我自己的滤镜应用于彩色图像【英文标题】:OpenCV apply my own filter to a color image 【发布时间】:2014-12-23 07:30:11 【问题描述】:

我正在使用 OpenCV C++ 过滤图像颜色。我想使用我自己的矩阵过滤图像。请参阅此代码:

img= "c:/Test/tes.jpg";
Mat im = imread(img);

然后我想过滤/乘以我的矩阵(这个矩阵可以替换为另一个矩阵 3x3)

Mat filter = (Mat_<double>(3, 3) <<17.8824, 43.5161, 4.11935, 
                                   3.45565, 27.1554, 3.86714, 
                                   0.0299566, 0.184309, 1.46709);

如何将img mat 矩阵与我自己的矩阵相乘?我仍然不明白如何将 3 通道 (RGB) 矩阵与另一个矩阵(单通道)相乘并生成具有新颜色的图像。

【问题讨论】:

【参考方案1】:

你应该看看opencv documentation。你可以使用这个功能:

filter2D(InputArray src, OutputArray dst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderType=BORDER_DEFAULT )

这会在你的代码中给你这样的东西:

Mat output;
filter2D(im, output, -1, filter);

关于三通道矩阵的问题;它在文档中指定:

kernel – convolution kernel (or rather a correlation kernel), a single-channel floating point matrix; if you want to apply different kernels to different channels, split the image into separate color planes using split() and process them individually.

因此,默认情况下,您的“过滤器”矩阵将平等地应用于每个颜色平面。

编辑您可以在 opencv 网站上找到一个功能齐全的示例:http://docs.opencv.org/doc/tutorials/imgproc/imgtrans/filter_2d/filter_2d.html

【讨论】:

感谢您的回答,但我在 MatLab 中找到了一个算法来解决这个问题。首先我们必须获取 R、G 和 B 矩阵中的每个像素。例如,从 ( row,col) (1,1)R,(1,1)G,(1,1)B,next 创建 mat 3x1 矩阵并与我自己的矩阵相乘,生成新的 3x1 矩阵。然后将新的每个元素将矩阵转换为新的 RGB 矩阵 (1,1)R->new value,(1,1)B->new value,依此类推。但我不知道在 C++ 中这样做。 你为什么要自己重写?只要使用opencv提供的功能,因为您使用的是opencv... @ChrisMaes 文档指出内核的大小可以是 3、5、7、9 和 11。但我有一个 5 * 4 的矩阵。例如: const _FILTER_2 = [ 0.4, 0.4, -0.3, 0.0, 1.0, // 0.0, 1.0, 0.0, 0.0, 1.0, // 0.0, 0.0, 1.2, 0.0, 1.0, // -1.2, 0.6, 0.7, 1.0, 1.0 ];你可能知道如何用 filter2D 应用这样的矩阵吗? @goldensoju 我已经有一段时间没有使用openCV了。这似乎是一个更具体的问题。考虑将其作为新问题发布。

以上是关于OpenCV 将我自己的滤镜应用于彩色图像的主要内容,如果未能解决你的问题,请参考以下文章

OpenCV - 将蒙版应用于彩色图像

OpenCV 例程200篇205. 调节色彩平衡/饱和度/明度

在OpenCV中使用Bayer格式

删除彩色图像的晕影滤镜

OpenCV竟然可以这样学!成神之路终将不远

如何使用 OpenCV 将梯度/幅度应用于图像?