cv2.MORPH_CLOSE 将字母连接在一起
cv2.MORPH_CLOSE joining letters together
我正在使用 Opencv 对图像进行一些形态学操作:
但是当我检测到它的轮廓时,它将一些字母连接在一起会产生问题。例如:
我可以用我的代码做一些调整来解决这个问题,还是我必须以不同的方式来解决这个问题?(但它必须是一个关闭算法或函数,因为它对预处理非常有帮助)。
我使用的代码如下:
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
这是可行的解决方案:
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)
最后一步是针对每个标签值在图像中找到与其对应的区域,处理该区域的外部轮廓并在输出图像中"draw"。
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)
希望对您有所帮助。
我正在使用 Opencv 对图像进行一些形态学操作:
我可以用我的代码做一些调整来解决这个问题,还是我必须以不同的方式来解决这个问题?(但它必须是一个关闭算法或函数,因为它对预处理非常有帮助)。
我使用的代码如下:
kernel = np.ones((5,5),np.uint8)
opening = cv2.morphologyEx(thresh, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(opening, cv2.MORPH_CLOSE, kernel)
这是可行的解决方案:
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)
最后一步是针对每个标签值在图像中找到与其对应的区域,处理该区域的外部轮廓并在输出图像中"draw"。
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)
希望对您有所帮助。