我正在处理车牌数据,我的工作是对其应用一系列过滤器,例如:
- 灰度
- 模糊
- 阈值处理
- 二值化
问题在于,在进行操作时,有些像这张图片边缘的轮廓,如何清除它们?或者将其变成黑色(掩膜)?我使用了这段代码,但有时会出错。
# invert image and detect contours
inverted = cv2.bitwise_not(image_binary_and_dilated)
contours, hierarchy = cv2.findContours(inverted,cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
# get the biggest contour
biggest_index = -1
biggest_area = -1
i = 0
for c in contours:
area = cv2.contourArea(c)
if area > biggest_area:
biggest_area = area
biggest_index = i
i = i+1
print("biggest area: " + str(biggest_area) + " index: " + str(biggest_index))
cv2.drawContours(image_binary_and_dilated, contours, biggest_index, [0,0,255])
center, size, angle = cv2.minAreaRect(contours[biggest_index])
rot_mat = cv2.getRotationMatrix2D(center, angle, 1.)
#cv2.warpPerspective()
print(size)
dst = cv2.warpAffine(inverted, rot_mat, (int(size[0]), int(size[1])))
mask = dst * 0
x1 = max([int(center[0] - size[0] / 2)+1, 0])
y1 = max([int(center[1] - size[1] / 2)+1, 0])
x2 = int(center[0] + size[0] / 2)-1
y2 = int(center[1] + size[1] / 2)-1
point1 = (x1, y1)
point2 = (x2, y2)
print(point1)
print(point2)
cv2.rectangle(dst, point1, point2, [0,0,0])
cv2.rectangle(mask, point1, point2, [255,255,255], cv2.FILLED)
masked = cv2.bitwise_and(dst, mask)
#cv2_imshow(imgg)
cv2_imshow(dst)
cv2_imshow(masked)
#cv2_imshow(mask)
一些结果: 原始结果为:
1. 好结果 1 2. 好结果 2 3. 好结果 3 4. 好结果 4 5. 坏结果 1 6. 坏结果 2 二进制板是:
1. 图像 1 2. 图像 2 3. 图像 3 4. 图像 4 5. 图像 5 - 坏结果 1 6. 图像 6 - 坏结果 2 我该如何修复此代码?只是希望避免不良结果或改进它。
image_binary_and_dilated
(第二行 - 我假设是初始图像,但它已经被膨胀了吗?)和gray
(在 warpAffine 中)是什么吗?也许简单解释一下为什么要使用旋转矩阵和 warpAffine?这将使代码更易于理解,谢谢。 - freerafiki