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

2024-05-19 07:04:58 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个图像如下:enter image description here

在这张图片中,有两条明亮的线条贯穿整个图像,这就是我想要去除/减少外观的东西。在

我使用了一个阈值来识别这些明亮的条纹,它能很好地识别出这些区域:

enter image description here

目前我正在尝试一种缩小的方法,其中我试图减少像素的亮度,使他们不突出的图像。然而,这导致了奇怪的结果,我不知道为什么会这样。在

奇怪的结果是: 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()

我不确定我到底哪里出错了,或者是否有更好的方法来获得我想要的东西

编辑:

*我想看到的是,可见的线条变得与周围的线条相似,因此看起来它们已经从图像中移除了*


Tags: 方法图像imgnp像素resultwherecv2
2条回答

不确定您希望的输出是什么,但是一种消除不均匀光照的方法是复制图像并在大面积上模糊,以消除高频变化,只保留低频、缓慢变化的区域,并将其称为背景光。然后从原始图像中减去此背景。在

我只需要使用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/SOIN或CIMG或IMAGEMGAK Python绑定来完成相同的操作。在

本质上,该处理将删除以下作为背景照明:

enter image description here

这个答案是基于这样一个假设:亮点总是以垂直线的形式出现。在这个样本图像上进行了测试,结果是相当好的,但是在其他类似的图片上肯定需要更多的测试。也就是说,我建议你试着找出阈值图像上的白点,这就是“斑点”,就像你已经在倒数第二张图片中发布的一样。如果愿意,可以通过转置函数np.findnonzero(thresholded_image)来获得位置或坐标。然后迭代列表,将原始图像的所有像素替换为与iter坐标相同的像素(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()函数,而不是遍历每个像素:

^{pr2}$

结果:

enter image description here

相关问题 更多 >

    热门问题