如何使用 OpenCV 检测和修复图像中的坏点?
How to detect and fix dead pixels in images using OpenCV?
我有一些图像有坏点(或结果不好的像素)我有原始数据(拜耳化数据)。
如何使用 OpenCV 检测和修复它们?
我尝试使用拜耳数据过滤器来修复它们。在我的算法中,我检测每个像素的颜色,如果它是绿色,则使用 X 模式查找相邻的绿色像素,如果当前像素的值超过相邻像素的 40 个,则像素值按相邻像素的平均值变化像素.
使用 + 模式对红色和蓝色执行相同的操作。
但是并没有解决问题。
有什么算法可以修复这些坏点吗?
我建议您为此目的使用 median filter。
C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
过滤器的优点是它不是卷积。它不会处理操作(不意味着,没有你的邻居之间的平均计算)它只会从邻域中获取一个像素值(这恰好是你的邻居像素数组的中值)。
例如给定一张图像(一个颜色通道)上的 3x3
window :
155 153 2 <- Noise here on the 3rd column
148 147 146
144 0 146 <- Noise here on the 2nd column
我们想要得到一个介于 144
和 155
之间的像素值,对吗?
如果我们使用 mean filter,我们会计算平均值:(155+153+2+148+147+146+144+0+146)/9 = 116
,这与实际值不接近。这就是您似乎所做的,因此结果不令人满意。
如果我们使用median filter,我们选择以下排序像素中的中值[0,2,144,146,146,147,148,153,155]
找到的中位数是 146 更接近实际情况 !
这里是内核大小为 3x3
的中值滤波器结果示例:
在你的图像上使用相同的滤镜我得到:
我有一些图像有坏点(或结果不好的像素)我有原始数据(拜耳化数据)。
如何使用 OpenCV 检测和修复它们?
我尝试使用拜耳数据过滤器来修复它们。在我的算法中,我检测每个像素的颜色,如果它是绿色,则使用 X 模式查找相邻的绿色像素,如果当前像素的值超过相邻像素的 40 个,则像素值按相邻像素的平均值变化像素.
使用 + 模式对红色和蓝色执行相同的操作。
但是并没有解决问题。
有什么算法可以修复这些坏点吗?
我建议您为此目的使用 median filter。
C++: void medianBlur(InputArray src, OutputArray dst, int ksize)
过滤器的优点是它不是卷积。它不会处理操作(不意味着,没有你的邻居之间的平均计算)它只会从邻域中获取一个像素值(这恰好是你的邻居像素数组的中值)。
例如给定一张图像(一个颜色通道)上的 3x3
window :
155 153 2 <- Noise here on the 3rd column
148 147 146
144 0 146 <- Noise here on the 2nd column
我们想要得到一个介于 144
和 155
之间的像素值,对吗?
如果我们使用 mean filter,我们会计算平均值:(155+153+2+148+147+146+144+0+146)/9 = 116
,这与实际值不接近。这就是您似乎所做的,因此结果不令人满意。
如果我们使用median filter,我们选择以下排序像素中的中值[0,2,144,146,146,147,148,153,155]
找到的中位数是 146 更接近实际情况 !
这里是内核大小为 3x3
的中值滤波器结果示例:
在你的图像上使用相同的滤镜我得到: