В настоящее время я делаю проект по выявлению сломанных или плохих продуктов из потока продуктов. Я пытаюсь использовать Opencv, чтобы извлечь края благоразумный. Ниже приведены границы, полученные от плохого продукта и образца продукта соответственно.
Края довольно четкие, но есть много маленьких областей бессмысленных пятен (шумов), поэтому кажется невозможным напрямую сравнивать эти две фотографии попиксельно. Я думал, смогу ли я продолжать вращать и сдвигать плохой продукт и найти лучший результат сравнения, такой как квадратная разница между пикселями. Однако с этими шумами этот метод кажется невозможным.
Поэтому я думаю, есть ли способ выделить самые большие связанные области или разделить эти связанные области на несколько изображений? Или, если существует лучший метод сравнения даже в этих условиях?
Большое спасибо!!!
Поэтому я пытаюсь объяснить одно возможное решение здесь. После того, как вы размыли свое изображение и получили изображение края, вы можете сгущать найденные края с помощью расширения. Если у вас есть набор X и структурированный элемент B, расширение можно понимать как набор точек x, покрытых B, когда центр B находится внутри X:
Если вы хотите прочитать больше об этой теме, я рекомендую вам П. Сойл: Морфологический анализ изображений.
Знайте, что ваши края толще и связаны. После findContours вы выбираете самый большой контур (вы должны сделать несколько более сложных тестов). Вот результаты, которые я получил:
int dilation_type = MORPH_RECT;//MORPH_CROSS,MORPH_ELLISPE
int dilation_size = 2;
Mat element = getStructuringElement( dilation_type,Size( 2*dilation_size + 1,2*dilation_size+1 ),Point( dilation_size, dilation_size ));
dilate( src, erosion_dst, element );
Других решений пока нет …