How to detect and fix dead pixels in images using OpenCV?

I have some images that they have dead pixels (or pixels that has bad result) I have raw data (bayered data).

在这里输入图像描述

How can I detect and fix them using OpenCV?

I tried to fix them using a filter on bayer data. In my algorithm, I detect the color of each pixel and if it was green used an X pattern to find neighboring green pixels and if the value of current pixel is more than say 40 of the neighboring pixels, the pixel value changes by average of neighboring pixels.

did the same things for red and blue using + pattern.

But it did not fix the issue.

Any algorithm which can fix these dead pixels?


I would suggest you to use a median filter for that purpose.

C++: void medianBlur(InputArray src, OutputArray dst, int ksize)

The advantage of the filter is that it is not a convolution. It will not process operation (no mean, no average computation among your neighbors) it will just take one pixel value from the neighbourhood (which is exactly the median value of your neighbours pixel array).

For instance given a 3x3 window on one image (one color channel) :

155 153  2    <- Noise here on the 3rd column
148 147 146
144  0  146   <- Noise here on the 2nd column

We would like to get a pixel value which would be between 144 and 155 right ?

If we use a mean filter we compute the average : (155+153+2+148+147+146+144+0+146)/9 = 116 which is not a close value to the reality. This is what you seem to do hence an unsatisfiying result.

If we use a median filter, we choose the median values among the following sorted pixels [0,2,144,146,146,147,148,153,155]
The median found is 146 which is closer to the reality !

Here an example of a median filter result with a 3x3 kernel size :

在这里输入图像描述在这里输入图像描述

Using the same filter on your image I get :

在这里输入图像描述

链接地址: http://www.djcxy.com/p/89818.html

上一篇: 在OpenCV Mat图像中显示Vec3b像素值

下一篇: 如何使用OpenCV检测并修复图像中的坏点?