如何使用opencv for android app删除牌照周围的黑色边框

时间:2017-03-30 16:04:01

标签: android opencv

我想删除牌照周围的黑色边框。我正在使用opencv + android。
请回复使用我可以删除边框的代码。

我还附上了图片。image 1

1 个答案:

答案 0 :(得分:0)

您可以执行(DoG)高斯差异以检测图像中的高频细节。图像中的高频率表示不同的边缘角落

以下是所请求的代码。这些解释作为旁边的评论:

import cv2                      
img = cv2.imread('number_plate.jpg')     #---Reading the image---   
img1 = img.copy()    #----The final contour will be drawn on the copy of the original image--- 
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)   #---converting to gray scale---

在执行DoG之前,我通过应用自适应直方图均衡来增强灰色销售图像:

clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
enhanced = clahe.apply(gray_img)
cv2.imshow(enhanced_gray_img', enhanced)

enter image description here

现在我使用两个独立的内核执行高斯模糊,并按如下方式减去结果图像:

blur1 = cv2.GaussianBlur(enhanced, (15, 15), 0)
blur2 = cv2.GaussianBlur(enhanced, (25, 25), 0)
difference = blur2 - blur1
cv2.imshow('Difference_of_Gaussians', difference)

enter image description here

然后我在上面的图像上执行了二进制阈值并找到了轮廓。我绘制了面积最大的轮廓:

ret, th = cv2.threshold(difference, 127,255, 0)    #---performed binary threshold ---

_, contours, hierarchy = cv2.findContours(th, cv2.RETR_EXTERNAL, 1)    #---Find contours---
cnts = contours
max = 0    #----Variable to keep track of the largest area----
c = 0      #----Variable to store the contour having largest area---
for i in range(len(contours)):
    if (cv2.contourArea(cnts[i]) > max):
        max = cv2.contourArea(cnts[i])
        c = i

rep = cv2.drawContours(img1, contours[c], -1, (0,255,0), 3)    #----Draw the contour having the largest area on the image---
cv2.imshow('Final_Image.jpg', rep)

enter image description here

瞧!你去吧。

现在,您可以获得找到的轮廓的边界矩形,并将这些坐标作为区域提供给OCR,以提取存在的文本