Перейти к содержимому
Compvision.ru
Kvothe

Распознавание неба

Recommended Posts

Всем привет. Передо мной стоит задача распознать небо на фото. Использую 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;
}

 

32.JPG

image01_res22.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Надо искать небо исключительно на одном этом фото? Или задача стоит более обшно? А облака относятся к небу? Небо может быть розовым-закатным, пасмурным, вечерним, со звёздами? Оно будет на каждом изображении гарантировано? Или могут быть изображения без неба?

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

Я бы начал разработку с классики: создания и разметки наиболее поного датасета. Тогда проблема станет видна во всей своей красе.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Ищете ответ на вопрос в направлении семантической сегментации. Эта задача уже решена

http://mi.eng.cam.ac.uk/projects/segnet/#demo

https://github.com/alexgkendall/caffe-segnet

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
9 часов назад, Nuzhny сказал:

Надо искать небо исключительно на одном этом фото? Или задача стоит более обшно? А облака относятся к небу? Небо может быть розовым-закатным, пасмурным, вечерним, со звёздами? Оно будет на каждом изображении гарантировано? Или могут быть изображения без неба?

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

Я бы начал разработку с классики: создания и разметки наиболее поного датасета. Тогда проблема станет видна во всей своей красе.

На любом фото. Изначально стоит задача искать только полностью голубое небо без облаков. Если облака и могут быть на фото то совсем мало. Изображения без неба конечно могут быть надо это учитывать. Я двигался в сторону нахождения линии где кончаются объекты и начинается небо, но там оказалось слишком сложно и я все еще не могу в этом разобраться. Если найти эту линию то тогда сразу понятно что все что выше её это небо. Спасибо за ответ.

house.jpg

image01_res2.jpg

sunset.jpg

image01_res2.jpg

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Я соглашусь с mult1plexer, сейчас нейросети дадут результат быстрый и устойчивый. Можно начать с U-net, для бинарной сегментации небо-не небо зайдёт хорошо и будет работать быстро. К тому же ему не нужен огромный датасет.

Если же хочется классического компьютерного зрения, то всё будет сложнее. Но это точно не уход в серый с градиентами. Я бы всё равно собрал небольшой датасет, обучил бы на нём очень быстрый decision tree из OpenCV, а дальше watershed. Decision tree можно обучать как просто на цвете пикселя, так и градиент туда добавить, если хочется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×