【问题标题】:segment each character from noisy number plate从嘈杂的车牌中分割每个字符
【发布时间】:2019-04-18 10:37:21
【问题描述】:

我正在做一个关于尼泊尔车牌检测的项目,我从车辆中检测到我的车牌,但车牌歪斜,但结果是车牌的嘈杂图像。

我想知道如何从中分割出每个字符,以便将其发送到检测部分。我试过这样做,但它只是从第二行分割字符。

def segment(image):
    H = 100.
    height, width, depth = image.shape
    imgScale = H/height
    newX,newY = image.shape[1]*imgScale, image.shape[0]*imgScale
    image = cv2.resize(image,(int(newX),int(newY)))

    cv2.imshow("Show by CV2",image)
    cv2.waitKey(0)
    cv2.imwrite("resizeimg.jpg",image)

    idx =0 
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    _,thresh = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)

    cv2.imshow("thresh",thresh)
    cv2.waitKey(0)

    # gray=cv2.cvtColor(plate,cv2.COLOR_BW2GRAY)
    _,contours,_ = cv2.findContours(thresh,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
    for cnt in contours:
        idx += 1
        x,y,w,h = cv2.boundingRect(cnt)
        roi = image[y:y+h,x:x+w]
        if(w > 10 and h > 10):
            cv2.imwrite(str(idx) + '.jpg', roi)

【问题讨论】:

  • 您需要从输入图像中分割出白色。 cv2.inRange() 方法可用于分割数字,然后您可以对其应用轮廓检测​​来分割字符。
  • 但我们也有车牌号为白色背景和红色文字的车辆。 @ZdaR
  • 那么你应该进行边缘检测,但请记住,阴影等会产生很多噪音。我猜你写了一个小的 sn-p 来检测背景颜色,具体取决于背景的颜色,你可以切换分割哪种颜色的逻辑。

标签: python opencv image-processing image-segmentation text-segmentation


【解决方案1】:

假设你有盘子的比例,你可以在 y 轴上把盘子切成两半。从左到右,thresh 图像,morphologyEx 图像,轮廓。另一半也一样。

image = cv2.imread("1.PNG")

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
_,thresh = cv2.threshold(gray,127,255,cv2.THRESH_TOZERO)
cv2.imshow("thresh",thresh)

element = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=(5, 11))

morph_img = thresh.copy()
cv2.morphologyEx(src=thresh, op=cv2.MORPH_CLOSE, kernel=element, dst=morph_img)
cv2.imshow("morph_img",morph_img)


_,contours,_ = cv2.findContours(morph_img,cv2.RETR_LIST,cv2.CHAIN_APPROX_SIMPLE)
for c in contours:
    r = cv2.boundingRect(c)
    cv2.rectangle(image,(r[0],r[1]),(r[0]+r[2],r[1]+r[3]),(0,0,255),2)

cv2.imshow("img",image)

cv2.waitKey(0)
cv2.destroyAllWindows()

另一种分割字符的方法是沿 x 轴和 y 轴求灰度值之和。您可以很容易地看到 x 轴上有 3 个峰值,即 3 个字符,而 y 轴上有 1 个峰值,即您的字符所在的位置。

【讨论】:

  • 使用这个x_hist = np.sum(morph_img,axis=0).tolist() #axis=1 for y-axis 得到上面的总和。
猜你喜欢
  • 1970-01-01
  • 2021-05-25
  • 2020-09-16
  • 1970-01-01
  • 2017-09-30
  • 2023-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多