Предварительная обработка изображения перед применением обнаружения Canny Edge

У меня есть изображение комнаты ниже, и я хочу обнаружить все края стен. Я перепробовал много разных комбинаций фильтров (двусторонний, гауссовский, лапласовский и т. д.), и лучшая комбинация выглядит следующим образом:

  • Преобразование изображения в оттенки серого
  • Применить двусторонний фильтр
  • Запустите процесс обнаружения края Canny
  • Примените еще два двусторонних фильтра, чтобы удалить любой шум
  • Примените фильтр расширения, чтобы «заткнуть» все отверстия по краям.

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

cv::Mat edgeFrame;
cv::Mat grayImage;
cv::Mat blurFrame;
outputFrame=inputFrame.clone();

getGray(inputImage, grayImage);
cv::bilateralFilter(grayImage, blurFrame, 9,80, 80);
cv:Canny(blurFrame, edgeImage,100, 110,5);
cv::bilateralFilter(edgeImage, blurFrame, 21 , 80, 80);
cv::bilateralFilter(blurFrame, edgeImage,21, 100, 150);
int dilation_size =1;
Mat element = getStructuringElement( MORPH_ELLIPSE,
                                    Size( 2*dilation_size + 1, 2*dilation_size+1 ),
                                    Point( dilation_size, dilation_size ) );
dilate( edgeImage, outputFrame, element );

введите описание изображения здесь

введите описание изображения здесь


person WagglyWonga    schedule 10.03.2016    source источник
comment
Обработка должна производиться в режиме реального времени? Или можно потратить (несколько?) секунд?   -  person Miki    schedule 10.03.2016
comment
Попробуйте насыщенность или синий канал.   -  person Piglet    schedule 10.03.2016
comment
@Miki - это не обязательно делать в режиме реального времени, допустимо несколько секунд.   -  person WagglyWonga    schedule 11.03.2016
comment
@Piglet - я уже пытался увеличить насыщенность, но это не сильно изменилось, я попробую увеличить синий канал и посмотрю, каковы результаты.   -  person WagglyWonga    schedule 11.03.2016
comment
@WagglyWonga, что вы имеете в виду под увеличением насыщенности и синего? Вы теряете информацию, когда создаете серое изображение. Поэтому попробуйте выполнить обнаружение границ в отдельных каналах и объединить результаты. Можете ли вы получить что-то еще, кроме Jpg? Я взглянул на это изображение и обнаружил довольно уродливые артефакты сжатия в канале hue.   -  person Piglet    schedule 11.03.2016
comment
@Piglet Извините, я неправильно понял, что вы имели в виду. Я применил определение края только к синему каналу и получил намного лучшие результаты, но я все еще пытаюсь получить вертикальный край, идущий от потолка к столешнице, и я думаю, что это связано с тенями в комнате. Позже попробую загрузить картинку с кодом.   -  person WagglyWonga    schedule 11.03.2016


Ответы (1)


Проблема заключается в тенях на этих краях, вызванных тем, что освещение исходит исключительно от солнца через окно, а внутри комнаты нет источника света. Также картинка относительно темная, так что ее гистограмма будет сконцентрирована в нижней части. Сказав это, я бы применил выравнивание гистограммы в качестве первого шага, чтобы распределить интенсивность по всему диапазону 0-255, а затем, в пределах осторожности, применил бы относительно большую сигму (размытие по Гауссу), чтобы подавить высокочастотные края.

Обновление: 1) значение серого введите здесь описание изображения

2) histeq введите здесь описание изображения

3) осторожный введите здесь описание изображения

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

person Settembrini    schedule 11.03.2016
comment
Вы вообще что-то пробовали? Если да, можете ли вы опубликовать свой код и свои результаты? Или это просто предположение? - person Miki; 11.03.2016
comment
Я не работаю с открытым CV, но позже проверю его на Matlab и сообщу здесь. - person Settembrini; 11.03.2016
comment
Хороший! мне очень интересно ;D - person Miki; 11.03.2016
comment
@Settembrini Спасибо, я пытался поиграть с обнаружением и удалением теней / отражений с изображения, но я не эксперт в этой области, поэтому это был просто метод проб и ошибок. Я попробую ваш подход с выравниванием гистограммы и посмотрю, работает ли он. - person WagglyWonga; 11.03.2016
comment
@Settembrini переход от потолка к стене в проблемной области настолько плавный, что подход, основанный на градиенте, не найдет края, поскольку градиент очень низкий. Чем здесь может помочь выравнивание гистограммы? Вы не можете добавить информацию к изображению. вы можете просто изменить его. Выравнивание гистограммы в основном предназначено для улучшения видимости для человеческого глаза. тут никак не поможет. если ваше изображение плохое, предварительная обработка в мире изменит это. - person Piglet; 11.03.2016
comment
@piglet Я согласен, что край, на который смотрел settembrini, возможно, слишком слаб, чтобы его обнаружить, но вертикальный край от столешницы до потолка обнаружен в другом приложении, и я предполагаю, что они должны каким-то образом удалить тень, чтобы получить прямой край. - person WagglyWonga; 12.03.2016