检查图像中太薄的区域

Check for areas that are too thin in an image

我正在尝试验证雕刻机的黑白图像(更多的是剪贴画图像 - 而不是照片)。
我需要考虑的主要事情之一是区域的大小(或线条的宽度),因为机器无法处理太细的线条 - 所以我需要找到比给定阈值更细的区域。

以此图为例:

竖琴的琴弦可能太细,无法雕刻。

我正在阅读有关 Matlab 和 OpenCV 的内容,但图像处理是我第一次学习的领域。

我是一名 Java / C# 开发人员,因此使用其中一种语言完成的实现对我来说是最好的,但任何方向都将不胜感激。

使用 utilizing image morphological operations的解决方案:

定义允许区域的最小厚度,例如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

腐蚀和扩张应该使比 minThick 厚的区域保持不变,但它会移除薄区域

invalidArea = BW & ~deBW; %// pixels that are in BW but not in deBW

结果为:

您可以在链接文档中阅读有关 imdilate and imerode 的更多信息。

这主要是为了自包含,但这是与@Shai 在 Python 中执行的等效代码。我使用了 Python 中的 numpy and 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()

我需要指出的一些复杂问题:

  1. OpenCV 的 imread 函数以相对于 MATLAB 的相反顺序读取颜色通道。具体来说,频道以蓝-绿-红的顺序读入。这意味着第一个通道是蓝色的,第二个通道是绿色的,第三个通道是红色的。在 MATLAB 中,这些以正确的 RGB 顺序读取。因为这是一张灰度图像,所以 RGB 分量是相同的,所以使用哪个通道并不重要。但是为了和Shai的方法保持一致,红色通道正在访问,所以我们需要通过OpenCV访问图像的最后一个通道。
  2. MATLAB中结构编号为0的disk结构元素本质上是一个菱形。但是,因为 OpenCV 没有内置这个结构元素,而且我想生成尽可能少的代码来实现某些功能,所以我可以使用的最接近的东西是椭圆形结构元素。
  3. 为了使结构元素对称,您需要确保大小为奇数,所以我将大小从 Shai 的示例中的 4 更改为 5。
  4. 为了使用 OpenCV 显示图像 Python,图像必须至少是无符号 8 位整数类型。不支持使用OpenCV显示的二值图像,所以我人为制作了二值图像uint8,然后将值乘以255再显示。
  5. 您可以使用形态学开将腐蚀和膨胀操作合并为一个操作。 Opening 试图移除细线或断开连接稀疏但保持原始更大对象形状的对象。这是侵蚀的要点,这样你就可以删除这些线,但你会缩小对象的面积,然后扩大,这样你就可以将形状恢复到原来的大小(大部分)。我通过 cv2.morphologyEx.
  6. 执行形态学开运算来利用它

这是我得到的: