Линии сетки тоньше текста, поэтому я предлагаю следующее:
threshold-> erode -> удалить маленькие пятна -> dlate
Вотрезультат описанного выше метода: ![enter image description here](https://i.stack.imgur.com/MlSDY.jpg)
Мне нехорошо продолжать предоставлять пример кода на неправильном языке, но вот что сгенерировало этот результат в C ++.Я думаю, что вызовы функций должны быть очень похожи в Python.В частности, примечание об удалении большого двоичного объекта ( Как удалять небольшие связанные объекты с использованием OpenCV ), этот парень делает это в python, и он WAAAY чище, чем мой, поэтому я предлагаю вам сослаться на это, чтобы удалить свои небольшие большие двоичные объекты.Я удалил что-нибудь менее 15 пикселей, что было супер произвольно, и первое, что я попробовал.Возможно, я убил некоторых персонажей (не проверял) с таким максимальным пределом, поэтому вы захотите найти правильное значение для ваших целей.
int main(int argc, char** argv)
{
Mat image = imread("../../resources/images/fullForm.jpg", CV_LOAD_IMAGE_GRAYSCALE);
Mat thresholded, errodedImage, openedImage;
threshold(image, thresholded, 200, 255, THRESH_BINARY_INV);
//errode first
erode(thresholded, errodedImage, getStructuringElement(MORPH_CROSS, Size(3, 3)), cv::Point(-1, -1), 1);
//delete any blobs with less than 15 px
Mat labels, stats, centroids;
Mat deblobbedImage = errodedImage.clone();
int nccomps = connectedComponentsWithStats(errodedImage, labels, stats, centroids);
std::vector<int> smallBlobs = std::vector<int>();
for (int i = 0; i < nccomps; i++)
{
if (stats.at<int>(i, CC_STAT_AREA) < 15)
{
smallBlobs.push_back(0);
}
else
{
smallBlobs.push_back(1);
}
}
for (int y = 0; y < errodedImage.rows; y++)
{
for (int x = 0; x < errodedImage.cols; x++)
{
int label = labels.at<int>(y, x);
CV_Assert(0 <= label && label <= nccomps);
if (smallBlobs[label] == 0)
{
deblobbedImage.at<uchar>(y, x) = 0;
}
}
}
//dilate to restore text
dilate(deblobbedImage, openedImage, getStructuringElement(MORPH_CROSS, Size(3, 3)), cv::Point(-1, -1), 1);
imshow("source", image);
imshow("Thresholded", thresholded);
imshow("erroded", errodedImage);
imshow("deblobbed", deblobbedImage);
imshow("finished", openedImage);
waitKey(0);
return 0;
}