OpenCV: инвертирование негативных областей изображения - PullRequest
1 голос
/ 30 января 2020

Я использую OpenCV 3.4.6 в проекте c ++ / Objective C и получил изображение с отрицательными прямоугольными angular областями, как эта:

Image With Negative Rectangles

Я должен обнаружить эти негативные области, повернуть их вспять и, наконец, получить исходное изображение.

Я пытался использовать findContours , повышая контрастность исходного изображения или добавление порога , но прямоугольники не обнаружены.

Вот один из тестов, которые я пробовал:

Mat contrasted = [self enhanceContrastTo: matOriginal];

Mat thresholded;
threshold(contrasted, thresholded, 125, 241, THRESH_BINARY);

std::vector<std::vector<cv::Point> > contours;
std::vector<Vec4i> hierarchy;

findContours( thresholded, contours, hierarchy, CV_RETR_EXTERNAL, CV_RETR_TREE );

/* contrast method */
+(Mat)enhanceContrastTo:(Mat)image {

 cv::Mat lab_image;
 cv::cvtColor(image, lab_image, CV_BGR2Lab);

 // Extract the L channel
 std::vector<cv::Mat> lab_planes(3);
 cv::split(lab_image, lab_planes);  // now we have the L image in lab_planes[0]

 // apply the CLAHE algorithm to the L channel
 cv::Ptr<cv::CLAHE> clahe = cv::createCLAHE();

 // clahe->setClipLimit(4);
 clahe->setClipLimit(3);

 cv::Mat dst;
 clahe->apply(lab_planes[0], dst);

 // Merge the the color planes back into an Lab image
 dst.copyTo(lab_planes[0]);
 cv::merge(lab_planes, lab_image);

 // convert back to RGB
 cv::Mat image_clahe;
 cv::cvtColor(lab_image, image_clahe, CV_Lab2BGR);

 return image_clahe;
}

Прямоугольники явно я надеюсь, что opencv сможет их идентифицировать, но я не знаю как.

Есть идеи?

Спасибо

1 Ответ

1 голос
/ 30 января 2020

Этот конкретный вопрос не слишком сложен, но даже незначительные варианты могут стать сложными. Я могу посоветовать вам пару простых идей, которых должно хватить для решения проблемы.

1) Вместо контура вы можете проверить, близки ли соседние точки к обратному - это должно отфильтровать большинство нерелевантных ребер. Но простой проверки почти обратного хода недостаточно, поскольку монотонная серая область (127) также соответствует критериям. Требуется также минимальная пороговая разница.

2) Так как прямоугольники параллельны осям - вы можете просто go вдоль каждой строки и столбца и подсчитать количество пикселей, которые могут быть краями перевернутых прямоугольников. Лучше не просто посчитать число, но проверить, есть ли у вас непрерывные большие последовательности таких пикселей и записать, где именно эти сегменты.

3) Использовать найденные сегменты (или просто индексы строк и столбцов). ) перевернутых краевых пикселей, чтобы сделать кандидаты в перевернутые прямоугольники и затем сделать окончательные проверки.

Это всего лишь черновик go - он, безусловно, потребует уточнения. Я не уверен, почему вы хотели использовать функцию контура, tho.

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