как разделить часть неба и воды на картинке

Я пытаюсь разделить часть неба и воды на этом изображении.

Ссылка на изображение Я пробовал так много методов, таких как k-means, порог, мульти порог и т. д. НО, к сожалению, ничего не работало так хорошо. Вот пример моего кода (Matlab):

img=imread('1.jpg');
im_gray=rgb2gray(img);
b=imadjust(im_gray);
imshow(b);
bw_remove_small=imopen(b,strel('square',5));
imshow(bw_remove_small); %after 1st iteration
m3=medfilt2(bw_remove_small,[18,16]);
imshow(m3);
m3=medfilt2(bw_remove_small,20,20]);
m3=medfilt2(bw_remove_small,[20,20]);
imshow(m3);
I1=m3;
I2=rgb2gray(I1);
I=double(I2);
figure
subplot(1,3,1)
imshow(I1)
subplot(1,3,2)
imshow(I2)
g=kmeans(I(:),4);
J = reshape(g,size(I));
subplot(1,3,3)
imshow(J,[]);

Кто-нибудь может мне помочь


person user3046384    schedule 28.11.2013    source источник
comment
Ну, проще было бы сделать это вручную. Однако правильная пометка вашего вопроса может помочь, какой это язык?   -  person Laurent S.    schedule 28.11.2013
comment
Вы можете рассмотреть возможность использования преобразования Хафа (доступного в MATLAB) на карте краев изображения, чтобы найти горизонт. Тогда определить, какая половина изображения содержит небо или воду, не так уж сложно.   -  person Falimond    schedule 29.11.2013
comment
Я бы попробовал использовать информацию о цвете. В настоящее время вы отбрасываете его с помощью rgb2gray.   -  person Alessandro Jacopson    schedule 01.12.2013


Ответы (1)


Две области изображения отличаются оттенком, текстурой и яркостью уровня серого.

Горизонт — лучшая линия на изображении с нашей точки зрения, и ее можно увидеть по отчетливому изменению яркости. Яркость не будет работать с одним порогом, потому что яркость изображения не плоская, поэтому используйте модель распределения яркости, чтобы сгладить небо или воду. Это подразумевает знание цели, но есть две вещи, которые могут дать вам приблизительный ответ: текстура и/или оттенок.

Оттенок с порогом 120 (полученный из гистограммы оттенков) даст вам две области, но не будет четко разделен и будет иметь перекрывающиеся участки. Хотя с помощью этих двух разделов можно найти модель яркости.

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

Ключевым фактом является то, что если небо правильно смоделировано как серая поверхность, вы можете вычесть его из изображения и использовать простой порог, чтобы вытащить его.

Обнаружение краев на этом изображении очень шумное, чтобы можно было легко увидеть линию, но если вы можете вытащить линии изображения, не теряя формы, а затем искать прямой и длинный контур, это может потребовать меньше кода/работы.

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

person Jason    schedule 06.12.2013