版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/wl1070325332/article/details/77930232
今天在做練習的時候,突然發現自己寫的灰度圖像處理程序只能處理圖片的一部分,百思不得其解。
先上練習代碼:
//打開指定路徑下的圖片
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後,終於得到了正確的結果。
正確結果: