Jam*_*ack 4 python matlab opencv image-processing
我正在尝试验证雕刻机的黑白图像(更多的剪贴画图像 - 而不是照片).
我需要考虑的一个主要问题是区域的大小(或线宽),因为机器无法处理太薄的线 - 所以我需要找到比给定阈值更薄的区域.
以此图片为例:

竖琴的琴弦可能太薄而无法雕刻.
我正在阅读有关Matlab和OpenCV的内容,但图像处理是我第一次学习的领域.
我是一名Java/C#开发人员,因此使用其中一种语言完成的实现对我来说是最好的,但任何方向都将受到高度赞赏.
定义允许区域的最小厚度,例如, minThick=4
BW = imread('http://i.stack.imgur.com/oXKep.jpg');
BW = BW(:,:,1) < 128; %// convert image to binary mask
se = strel('disk', minTick/2, 0); %// define a disk element
eBW = imerode( BW, se ); %// "chop" half thickness from mask
deBW = imdilate( eBW, se ); %// dilate the eroded mask
Run Code Online (Sandbox Code Playgroud)
腐蚀和扩张应该留下厚度minThick不变的区域,但是它会去除薄的区域
invalidArea = BW & ~deBW; %// pixels that are in BW but not in deBW
Run Code Online (Sandbox Code Playgroud)
结果:

你可以阅读更多关于imdilate和imerode链接的文档.
这主要是为了自我遏制,但这与 @Shai 在 Python 中执行的代码等效。我使用了Python 中的numpy和OpenCV包。在 Python 中执行此操作的等效代码就是:
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()
Run Code Online (Sandbox Code Playgroud)
我需要指出的一些错综复杂的地方:
imread函数相对于 MATLAB以相反的顺序读取颜色通道。具体来说,通道以蓝-绿-红顺序读入。这意味着第一个通道是蓝色的,第二个通道是绿色的,第三个通道是红色的。在 MATLAB 中,这些以正确的 RGB 顺序读取。因为这是一个灰度图像,RGB 分量是相同的,所以你使用哪个通道并不重要。但是,为了与Shai的方法一致,红色通道是被访问的,所以我们需要通过OpenCV来访问图像的最后一个通道。diskMATLAB中结构号为0的结构元素本质上是一个菱形。但是,因为 OpenCV 没有内置这个结构元素,而且我想生成尽可能少的代码来使事情顺利进行,所以我可以使用的最接近的是椭圆形结构元素。uint8并将值乘以 255,然后再显示。cv2.morphologyEx.这就是我得到的:
