-1


我正在使用 Opencv 对图像进行一些形态学操作: 输入 但是当我检测到它的轮廓时,它将一些字母连接在一起会产生问题。例如:

连体字

我可以用我的代码做一些调整来解决这个问题还是我必须以不同的方式来做这个?(但它必须是一个关闭算法或函数,因为它在预处理中非常有帮助)。

我正在使用的代码如下:

kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
4

1 回答 1

0

这是可行的解决方案:

  import numpy as np
  import cv2
  from matplotlib import pyplot as plt

  I = cv2.imread('/home/smile/Downloads/words.jpg',cv2.IMREAD_GRAYSCALE)

  _,It = cv2.threshold(I,0.,255,cv2.THRESH_OTSU)
  It = cv2.bitwise_not(It)
  _,labels = cv2.connectedComponents(I)

  result = np.zeros((I.shape[0],I.shape[1],3),np.uint8)

  for i in range(labels.min(),labels.max()+1):
     mask = cv2.compare(labels,i,cv2.CMP_EQ)

     _,ctrs,_ = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

     result = cv2.drawContours(result,ctrs,-1,(0xFF,0,0))

  plt.figure()
  plt.imshow(result)    
  plt.axis('off')

在前两个步骤中,图像被二值化和反转,以使字母看起来是黑色的。

_,It = cv2.threshold(I,0.,255,cv2.THRESH_OTSU)
It = cv2.bitwise_not(It)

垃圾桶

然后在下一步中,每个字母都成为一个标记区域。

_,labels = cv2.connectedComponents(I)

标签

最后一步包括为每个标签值找到图像中与其对应的区域,处理该区域的外部轮廓并将其“绘制”在输出图像中。

result = np.zeros((I.shape[0],I.shape[1],3),np.uint8)

for i in range(labels.min(),labels.max()+1):
   mask = cv2.compare(labels,i,cv2.CMP_EQ)

   _,ctrs,_ = cv2.findContours(mask,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_NONE)

   result = cv2.drawContours(result,ctrs,-1,(0xFF,0,0)

希望能帮助到你。

于 2018-08-16T06:26:12.370 回答