python去除噪点_OpenCV-去除图像中的噪点

I have an image here with a table.. In the column on the right the background is filled with noise

How to detect the areas with noise? I only want to apply some kind of filter on the parts with noise because I need to do OCR on it and any kind of filter will reduce the overall recognition

And what kind of filter is the best to remove the background noise in the image?

As said I need to do OCR on the image

解决方案

I tried some filters/operations in OpenCV and it seems to work pretty well.

Step 1: Dilate the image -

kernel = np.ones((5, 5), np.uint8)

cv2.dilate(img, kernel, iterations = 1)

As you see, the noise is gone but the characters are very light, so I eroded the image.

Step 2: Erode the image -

kernel = np.ones((5, 5), np.uint8)

cv2.erode(img, kernel, iterations = 1)

As you can see, the noise is gone however some characters on the other columns are broken. I would recommend running these operations on the noisy column only. You might want to use HoughLines to find the last column. Then you can extract that column only, run dilation + erosion and replace this with the corresponding column in the original image.

Additionally, dilation + erosion is actually an operation called closing. This you could call directly using -

cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

As @Ermlg suggested, medianBlur with a kernel of 3 also works wonderfully.

cv2.medianBlur(img, 3)

Alternative Step

As you can see all these filters work but it is better if you implement these filters only in the part where the noise is. To do that, use the following:

edges = cv2.Canny(img, 50, 150, apertureSize = 3) // img is gray here

lines = cv2.HoughLinesP(edges, 1, np.pi / 180, 100, 1000, 50) // last two arguments are minimum line length and max gap between two lines respectively.

for line in lines:

for x1, y1, x2, y2 in line:

print x1, y1

// This gives the start coordinates for all the lines. You should take the x value which is between (0.75 * w, w) where w is the width of the entire image. This will give you essentially **(x1, y1) = (1896, 766)**

Then, you can extract this part only like :

extract = img[y1:h, x1:w] // w, h are width and height of the image

Then, implement the filter (median or closing) in this image. After removing the noise, you need to put this filtered image in place of the blurred part in the original image.

image[y1:h, x1:w] = median

This is straightforward in C++ :

extract.copyTo(img, new Rect(x1, y1, w - x1, h - y1))

Final Result with alternate method

Hope it helps!

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值