import numpy as np # Import numpy package
import cv2 # Import OpenCV package
orig = cv2.imread('oXKep.jpg') # Read in image from disk
BW = orig[:,:,2] < 128 # Threshold below 128 to invert image
minThick = 5 # Define minimum thickness
se = cv2.getStructuringElement(cv2.MORPH_ELLIPSE, (minThick,minThick)) # define a disk element
finalBW = 255*cv2.morphologyEx(BW.astype('uint8'), cv2.MORPH_OPEN, se) # "chop" half thickness from mask and dilate the eroded mask
# Find invalid area
invalidArea = 255*np.logical_and(BW, np.logical_not(finalBW)).astype('uint8')
# Show original image
cv2.imshow('Original', orig)
# Show opened result
cv2.imshow('Final', finalBW)
# Show invalid lines
cv2.imshow('Invalid Area', invalidArea)
# Wait for user input then close windows
cv2.waitKey(0)
cv2.destroyAllWindows()
使用matlab利用图像morphological operations的解决方案:
定义允许区域的最小厚度,例如,
minThick=4
腐蚀和膨胀应使厚度大于
^{pr2}$minThick
的区域保持不变,但它会移除较薄的区域结果是:
您可以在链接文档中阅读有关^{} 和^{} 的更多信息。在
这主要是为了自包含,但这是与@Shai在Python中执行的代码相同的代码。我使用了Python中的^{} 和OpenCV包。在Python中执行此操作的等效代码如下:
我需要指出的几个复杂问题:
imread
函数在颜色通道中的读取顺序与MATLAB相反。具体来说,通道是以蓝绿红顺序读入的。这意味着第一个通道是蓝色的,第二个通道是绿色的,第三个通道是红色的。在MATLAB中,这些是按正确的RGB顺序读取的。因为这是灰度图像,所以RGB组件是相同的,所以使用哪个通道并不重要。但是,为了与Shai的方法一致,红色通道正在被访问,因此我们需要通过OpenCV访问图像的最后一个通道。在disk
结构元素本质上是一个菱形。但是,由于OpenCV没有内置这个结构元素,而且我希望生成尽可能少的代码来实现某些功能,所以我可以使用的最接近的是椭圆形状的结构元素。在uint8
,并在显示之前将值乘以255。在我得到的是:
相关问题 更多 >
编程相关推荐