有没有办法在OpenCv中删除图像中的垂直亮条纹?

时间:2019-04-03 12:27:05

标签: python python-3.x image opencv

我的图片如下:enter image description here

在此图像中,有两条亮线贯穿图像,这就是我要删除/减少其外观的内容。

我使用阈值来识别这些明亮的条纹,这样可以很好地识别出这些区域:

enter image description here

目前,我正在尝试使用reduce方法,该方法只是尝试降低像素的亮度,以使它们在图像中不会显得那么突出。但是,这会导致结果看起来很奇怪,但我不确定为什么会这样。

奇怪的结果: enter image description here

据我所见,它正在改变像素的值,但在最终图像中却留下了奇怪的结果。

到目前为止,我一直在使用此代码来执行该过程:

img = cv2.imread('43.bmp')

h,s,v= cv2.split(cv2.cvtColor(img, cv2.COLOR_BGR2HSV))

ret1,th1 = cv2.threshold(v,240,255,cv2.THRESH_BINARY)

bright = np.where(th1, np.where((255-v) < 40, v-30,v),0)

th1_n = cv2.bitwise_not(th1) 
dark = np.where(th1_n,v,0)

result = bright + dark

mergeColour = cv2.cvtColor(cv2.merge([h,s,result]),cv2.COLOR_HSV2BGR)

cv2.imshow("frame", mergeColour.astype(np.uint8))
cv2.waitKey(0)
cv2.destroyAllWindows()

我不确定我到底出了什么问题,或者是否有更好的方法获取ID的可能性

编辑:

* id想要看到的是可见行与周围的其他行具有相似的模糊度,因此看来它们已从图像中删除*

2 个答案:

答案 0 :(得分:2)

不确定您希望获得什么输出,但是消除不均匀照明的一种方法是对图像进行复制并在较大区域上进行模糊处理,以消除高频变化并仅保留低频,缓慢变化的区域,并称其为背景照明。然后从原始图像中减去该背景。

我只是使用ImageMagick来实现,ImageMagick包含在大多数Linux发行版中,并且可用于macOS和Windows。因此,只需在终端中:

convert input.gif \( +clone -blur 0x32 \) -compose difference -composite -auto-level result.jpg

enter image description here

您可以在Python或C ++中使用OpenCV,PIL / Pillow或CImg或ImageMagick Python绑定进行完全相同的操作。

从本质上讲,该处理将以下内容作为背景照明:

enter image description here

答案 1 :(得分:1)

此答案基于以下假设:亮点始终显示为垂直线。在此样本图像上进行了测试,结果相当不错,但是在其他类似图片上确实需要更多测试。话虽这么说,我建议您尝试在阈值图像上找到属于“斑点”的白色斑点,就像您已经在倒数第二个图像中张贴的一样。如果愿意,可以通过转置函数np.findnonzero(thresholded_image)获得位置或坐标。然后遍历该列表,并将原始图像中与该迭代具有相同坐标的所有像素替换为该像素之前的像素(x-1)。结果是:

import cv2
import numpy as np

img = cv2.imread('remove.png')
height,width = img.shape[:2]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
_, thresh = cv2.threshold(gray,225,255,cv2.THRESH_BINARY)

cds = np.transpose(np.nonzero(thresh))
for i in cds:
    if i[1] == 0:
        pass
    else:
        img[i[0],i[1]] = img[i[0], i[1]-1]


cv2.imshow("res", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

原始图片:

enter image description here

阈值图像:

enter image description here

结果图片:

enter image description here

希望它会有所帮助或为您提供一个有用的新想法。干杯!

编辑:

或者一种更好的方法: 使用cv2.inpaint()函数而不是遍历每个像素:

import numpy as np
import cv2

img = cv2.imread('remove.png')
mask = cv2.imread('thresh.png',0)

dst = cv2.inpaint(img,mask,3,cv2.INPAINT_TELEA)

cv2.imshow('dst',dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

结果:

enter image description here