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

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 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後,終於得到了正確的結果。

正確結果:


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章