今天在做練習的時候,突然發現自己寫的灰階圖像處理程式隻能處理圖檔的一部分,百思不得其解。
先上練習代碼:
//打開指定路徑下的圖檔
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後,終于得到了正确的結果。
正确結果: