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 将我自己的滤镜应用于彩色图像的主要内容,如果未能解决你的问题,请参考以下文章