天天看點

【數字圖像處理】關于處理灰階圖像時總是處理不全的問題

今天在做練習的時候,突然發現自己寫的灰階圖像處理程式隻能處理圖檔的一部分,百思不得其解。

先上練習代碼:

//打開指定路徑下的圖檔
	Mat srcImg = imread("E:\\學習之路\\數字圖像處理練習程式\\岡薩雷斯數字圖像處理MATLAB版圖檔\\dipum_images_ch03\\Fig0310(a)(Moon Phobos).tif");
	if(srcImg.empty())
	{
		cout << "打開圖檔錯誤" << endl;
	}

	//将原圖像進行直方圖均衡
	Mat dstImg = HistogramEquilibrium(srcImg);

	//顯示原圖像以及直方圖均衡後的效果圖
	imshow("原圖",srcImg);
	imwrite("./src.jpg",srcImg);
	imshow("直方圖均衡效果圖",dstImg);
	//儲存效果圖
	imwrite("./EffectImage.jpg",dstImg);
	waitKey(0);
	return 0;
           

原圖像:

【數字圖像處理】關于處理灰階圖像時總是處理不全的問題

處理後圖像:

【數字圖像處理】關于處理灰階圖像時總是處理不全的問題

後來翻了下别人的文章才發現,是因為自己在使用imread這個函數時,使用不當。

imread函數是opencv加載圖檔的函數,該函數有兩個參數,第一個參數是圖檔儲存路徑,第二個參數是指定讀取圖檔的方式。

enum
{
    // 8bit, color or not
    IMREAD_UNCHANGED  =-1,
    // 8bit, gray
    IMREAD_GRAYSCALE  =0,
    // ?, color
    IMREAD_COLOR      =1,
    // any depth, ?
    IMREAD_ANYDEPTH   =2,
    // ?, any color
    IMREAD_ANYCOLOR   =4
};
           

從上面的枚舉解釋中可以看到,當第二個參數為0時,是以8位單通道(灰階圖)方式加載圖檔;為1時,表示以8位,3通道(彩色圖像)方式加載圖檔;為2時,表示以原圖像深度(16位或32位,否則按8位),3通道方式加載圖檔;為4時,表示以8位,原圖像通道數方式加載圖檔。

如果想載入最真實無損的原圖像,可以使用 IMREAD_ANYDEPTH | IMREAD_ANYCOLOR 作為參數。

那麼,問題就迎刃而解了,因為在使用imread函數時沒有指定第二個參數,函數預設flag = 1(以3通道彩色圖像方式加載),可是我的源圖像是單通道的灰階圖像,是以處理後的結果就隻有源圖像的1/3。

将參數修改為0後,終于得到了正确的結果。

正确結果:

【數字圖像處理】關于處理灰階圖像時總是處理不全的問題

繼續閱讀