算法:
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);
}
得到目標圖: