Как я могу расширить двоичное изображение, не закрывая дыры с OpenCV - PullRequest
1 голос
/ 17 января 2020

Как применить расширение к двоичному изображению слева, не закрывая отверстие в l oop? Я также заинтересован в том, чтобы сделать это эффективно.

enter image description here

Контекст : мне нужно научить CNN читать рукописные цифры. Хотите верьте, хотите нет, но изображение слева должно быть 9. Поскольку в наборе данных написано много 9, я могу научить модель распознавать его. Однако мне нужно применить некоторое расширение, чтобы толщина di git была аналогична толщине цифр, вводимых в предварительно обученную модель. Я думаю, что если я потеряю дыру в l oop, у меня не будет шансов.

1 Ответ

4 голосов
/ 17 января 2020

Вам просто нужно заполнить отверстие внутри контура, инвертировать его, затем умножить на расширенное изображение: enter image description here

Вот код opencv (c ++):

Mat img__ = imread("E:/1.jpg", 0);
Mat img1;

threshold(img__, img1, 0, 255, THRESH_OTSU); # you don't need this line, I used it because I read the image from my hard disk. You can comment this line

vector<vector<Point>> contours;
vector< Vec4i > hierarchy;

findContours(img1, contours, hierarchy, RETR_CCOMP, CHAIN_APPROX_NONE);

Mat tmp = Mat::zeros(img1.size(), CV_8U);

for (size_t i = 0; i < contours.size(); i++)
{
    if (hierarchy[i][2] < 0) # this stands for the inner contours which surrounds the hole
        drawContours(tmp, contours, i, Scalar(255, 255, 255), -1);
}
Mat img2;
dilate(img1, img2, Mat::ones(9, 9, CV_8U));

imshow("original", img1);
imshow("1", tmp);
imshow("3", img2);

tmp = 255 - tmp;

imshow("2", tmp);

tmp = tmp / 255;

multiply(tmp, img2, img2);

imshow("4", img2);

waitKey(0);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...