用openCV删除部分边框

时间:2018-08-09 20:18:56

标签: python opencv image-processing python-imaging-library

我正在使用OpenCV在图像中查找表格数据,以便可以在其上使用OCR。到目前为止,我已经能够找到图像中的表格,找到表格的列,然后找到每一列中的每个单元格。它工作得很好,但是我遇到了细胞壁卡在图像中的问题,无法可靠地将其移除。This is one example that I'm having difficulty with. This would be another example.

我尝试了几种方法来使这些图像更好。我一直最幸运的是找到轮廓。

img2gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, mask = cv2.threshold(img2gray, 180, 255, cv2.THRESH_BINARY)
image_final = cv2.bitwise_and(img2gray, img2gray, mask=mask)
ret, new_img = cv2.threshold(image_final, 180, 255, cv2.THRESH_BINARY_INV)

kernel = cv2.getStructuringElement(cv2.MORPH_CROSS, (5, 3))

# dilate , more the iteration more the dilation
dilated = cv2.dilate(new_img, kernel, iterations=3)
cv2.imwrite('../test_images/find_contours_dilated.png', dilated)

我一直在研究内核大小和膨胀迭代,并发现这是最佳配置。

我使用的另一种方法是使用PIL,但只有在整个图像上边框均匀时才是非常好的,在我的情况下不是这样。

copy = Image.fromarray(img)
try:
    bg = Image.new(copy.mode, copy.size, copy.getpixel((0, 0)))
except:
    return None
diff = ImageChops.difference(copy, bg)
diff = ImageChops.add(diff, diff, 2.0, -100)
bbox = diff.getbbox()
if bbox:
    return np.array(copy.crop(bbox))

我尝试了其他一些想法,但没有一个使我走得很远。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

您可以尝试找到轮廓并将其“绘制”出来。这意味着您可以绘制一个边界,该边界将与图像的边界上的{walls(墙壁)” #include <iostream> #include <time.h> //It may be #include <ctime> or any other header file depending upon // compiler or IDE you're using using namespace std; int main() { // current date/time based on current system time_t now = time(0); // convert now to string form string dt = ctime(&now); cout << "The local date and time is: " << dt << endl; return 0; } 相连(它将结合所有轮廓-墙壁)。最大的两个轮廓将是墙的外线和内线,您可以将轮廓绘制为白色以删除边框。然后再次应用阈值以消除其余的噪声。干杯!

示例:

cv2.rectangle

结果:

enter image description here

enter image description here