去霧算法

算法:

       1,選取無霧天空中一點,得到像素值A1(196,227,255)(藍天的顏色)。選取有霧天空中的一點,得到像素值A2(168,173,179),f2(x,y)=f1(x,y)*A1/A2;   f1:有霧的圖;f2初步處理得到的新圖。

      2,直方圖均衡,得到新圖f3.

      3,判斷:當f3(x,y)<70,均衡後很暗的地區,f4(x,y)=f3(x,y)*0.1+f1(x,y)*0.9;else

f4(x,y)=f3(x,y)*0.6+f1(x,y)*0.4;     目的:f3人工修改的痕跡太明顯,如果原圖有些區域偏暗,那麼均衡後,暗區域整體變成黑色,這個要避免。其餘的地區也是爲了增加美感

      4,高斯濾波,讓整體更和諧。

原圖:


代碼如下:

(一)第一步:(每次加載注意圖像名稱,這裏可能沒有對應好,但是函數都是調試過的,沒有問題)

void Ctry::OnTryPath()
{
	// TODO:  在此添加命令處理程序代碼    
	IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\tt.jpg", -1);
	CvScalar pixel, pixel1;
	IplImage* pic = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
	for (int i = 0; i < img->height; i++)
	{
		for (int j = 0; j < img->width; j++)
		{
			pixel = cvGet2D(img, i, j);
			pixel1.val[0] = pixel.val[0] * (196.0 / 168.0);
			pixel1.val[1] = pixel.val[1] * (227.0 / 173.0);
			pixel1.val[2] = pixel.val[2] * (255.0 / 179.0);
			cvSet2D(pic, i, j, pixel1);
		}
	}
	cvSaveImage("C:\\Users\\Administrator\\Desktop\\pic.jpg", pic);

}

得到新圖:


直方圖均衡後得到:

void Ctry::OnTryTyr()
{
	IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\pic.jpg", -1);
	IplImage* merge = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
	IplImage* r = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
	IplImage* g = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
	IplImage* b = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
	cvSplit(img, b, g, r, NULL);
	stretch(r, r);//該函數見我的博客文章《圖像增強之直方圖均衡化》
	stretch(g, g);
	stretch(b, b);
	cvMerge(b, g, r, 0, merge);
	cvSaveImage("C:\\Users\\Administrator\\Desktop\\merge11.jpg", merge);

}


(內存太大,2,38M,傳不上來,截屏的)

第三步判斷,高斯濾波後:

void Ctry::OnTry()
{
	IplImage* img = cvLoadImage("C:\\Users\\Administrator\\Desktop\\merge11.jpg", -1);
	IplImage* img1 = cvLoadImage("C:\\Users\\Administrator\\Desktop\\try.jpg", -1);
	IplImage*  mer= cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);
	
	CvScalar pixel, pixel1, pixel2;
	for (int i = 0; i < img->height; i++)
	{
		for (int j = 0; j < img->width; j++)
		{
			
			pixel = cvGet2D(img1, i, j);
			pixel2 = cvGet2D(img, i, j);
			if (pixel2.val[0] < 100)    //太暗,說明是人或樹
			{
				pixel1.val[0] = pixel.val[0] * 0.9 + pixel2.val[0] * 0.1;
				pixel1.val[1] = pixel.val[1] * 0.9 + pixel2.val[1] * 0.1;
				pixel1.val[2] = pixel.val[2] * 0.9 + pixel2.val[2] * 0.1;
				cvSet2D(mer, i, j, pixel1);
			}
			else
			{
				pixel1.val[0] = pixel.val[0] * 0.4 + pixel2.val[0] * 0.6;
				pixel1.val[1] = pixel.val[1] * 0.4 + pixel2.val[1] * 0.6;
				pixel1.val[2] = pixel.val[2] * 0.4 + pixel2.val[2] * 0.6;
				cvSet2D(mer, i, j, pixel1);
			}
		}
	}

	cvSmooth(mer, mer, CV_GAUSSIAN, 3, 0, 0, 0);
	cvSaveImage("C:\\Users\\Administrator\\Desktop\\mer11.jpg", mer);
}

得到目標圖:



發佈了44 篇原創文章 · 獲贊 29 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章