Kvothe 0 Жалоба Опубликовано March 24, 2019 Всем привет. Передо мной стоит задача распознать небо на фото. Использую Visual Studio и OpenCV. Из результата хорошо видно что область неба более темная, но что делать дальше? Результатом может быть просто выведение части изображения с небом в отдельный файл. Возможно я спрашиваю что то совсем простое так как новичок в opencv. И за это прошу прощения. Заранее спасибо. int main(int argc, char** argv) { Mat src, src_gray; Mat grad; int scale = 1; int delta = 0; int ddepth = CV_64F; //int c; /// Load an image src = imread("1.jpg");; GaussianBlur(src, src, Size(3, 3), 0, 0, BORDER_DEFAULT); /// Convert it to gray cvtColor(src, src_gray, CV_BGR2GRAY); /// Generate grad_x and grad_y Mat gradient_image; Mat grad_x, grad_y; Mat abs_grad_x, abs_grad_y; /// Gradient X //Scharr( src_gray, grad_x, ddepth, 1, 0, scale, delta, BORDER_DEFAULT ); Sobel(src_gray, grad_x, ddepth, 1, 0, 3, scale, delta, BORDER_REPLICATE); convertScaleAbs(grad_x, abs_grad_x); /// Gradient Y //Scharr( src_gray, grad_y, ddepth, 0, 1, scale, delta, BORDER_DEFAULT ); Sobel(src_gray, grad_y, ddepth, 0, 1, 3, scale, delta, BORDER_REPLICATE); convertScaleAbs(grad_y, abs_grad_y); pow(abs_grad_x, 2, abs_grad_x); pow(abs_grad_y, 2, abs_grad_y); add(abs_grad_x, abs_grad_y, grad); gradient_image = grad; double ret, thresh = threshold(src_gray, src_gray,50, 255, THRESH_BINARY); imshow("gray", ret); imshow("sobel", src_gray); //imshow("sobel", grad); //imwrite("image01_res2.jpg", grad); //imshow("cobel1", abs_grad_y); //imshow("cobel2", abs_grad_x); imshow("orig", src); waitKey(0); return 0; } Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 24, 2019 Надо искать небо исключительно на одном этом фото? Или задача стоит более обшно? А облака относятся к небу? Небо может быть розовым-закатным, пасмурным, вечерним, со звёздами? Оно будет на каждом изображении гарантировано? Или могут быть изображения без неба? Странный подход, когда отбрасывается вся цветовая информация, казалось бы, небо голубое и это можно использовать. Я бы начал разработку с классики: создания и разметки наиболее поного датасета. Тогда проблема станет видна во всей своей красе. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
mult1plexer 1 Жалоба Опубликовано March 24, 2019 Ищете ответ на вопрос в направлении семантической сегментации. Эта задача уже решена http://mi.eng.cam.ac.uk/projects/segnet/#demo https://github.com/alexgkendall/caffe-segnet Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Kvothe 0 Жалоба Опубликовано March 25, 2019 9 часов назад, Nuzhny сказал: Надо искать небо исключительно на одном этом фото? Или задача стоит более обшно? А облака относятся к небу? Небо может быть розовым-закатным, пасмурным, вечерним, со звёздами? Оно будет на каждом изображении гарантировано? Или могут быть изображения без неба? Странный подход, когда отбрасывается вся цветовая информация, казалось бы, небо голубое и это можно использовать. Я бы начал разработку с классики: создания и разметки наиболее поного датасета. Тогда проблема станет видна во всей своей красе. На любом фото. Изначально стоит задача искать только полностью голубое небо без облаков. Если облака и могут быть на фото то совсем мало. Изображения без неба конечно могут быть надо это учитывать. Я двигался в сторону нахождения линии где кончаются объекты и начинается небо, но там оказалось слишком сложно и я все еще не могу в этом разобраться. Если найти эту линию то тогда сразу понятно что все что выше её это небо. Спасибо за ответ. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах
Nuzhny 243 Жалоба Опубликовано March 25, 2019 Я соглашусь с mult1plexer, сейчас нейросети дадут результат быстрый и устойчивый. Можно начать с U-net, для бинарной сегментации небо-не небо зайдёт хорошо и будет работать быстро. К тому же ему не нужен огромный датасет. Если же хочется классического компьютерного зрения, то всё будет сложнее. Но это точно не уход в серый с градиентами. Я бы всё равно собрал небольшой датасет, обучил бы на нём очень быстрый decision tree из OpenCV, а дальше watershed. Decision tree можно обучать как просто на цвете пикселя, так и градиент туда добавить, если хочется. Поделиться сообщением Ссылка на сообщение Поделиться на других сайтах