我正在使用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))
我尝试了其他一些想法,但没有一个使我走得很远。任何帮助将不胜感激。
答案 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
结果: