1. 程式人生 > >OpenCV影象處理常用手段

OpenCV影象處理常用手段

影象二值化操作

兩種方法,全域性固定閾值二值化和區域性自適應閾值二值化

全域性固定閾值很容易理解,就是對整幅影象都是用一個統一的閾值來進行二值化;

區域性自適應閾值則是根據畫素的鄰域塊的畫素值分佈來確定該畫素位置上的二值化閾值。

 

#include<opencv2\opencv.hpp>   
#include<opencv2\highgui\highgui.hpp>

using namespace std;
using namespace cv;

int main(int argc, char** argv)
{
    Mat image = imread("moon.jpg", CV_LOAD_IMAGE_GRAYSCALE); //注意了,必須是載入灰度圖
    if (image.empty())
    {
        cout << "read image failure" << endl;
        return -1;
    }

    // 全域性二值化
    int th = 100;
    Mat global;
    threshold(image, global, th, 255, CV_THRESH_BINARY_INV);

    // 區域性二值化
    int blockSize = 25;
    int constValue = 10;
    Mat local;
    adaptiveThreshold(image, local, 255, CV_ADAPTIVE_THRESH_MEAN_C, CV_THRESH_BINARY_INV, blockSize, constValue);

    imshow("原始圖",image);
    imshow("全域性二值化", global);
    imshow("區域性二值化", local);


    waitKey(0);
    return 0;
}

效果:

 

腐蝕操作

//3.腐蝕操作
int main()
{
	Mat SrcPic = imread("dog.jpg");
	imshow("原圖", SrcPic);
	Mat element = getStructuringElement(MORPH_RECT, Size(15, 15)); //getStructuringElement函式返回的是指定形狀和尺寸的結構元素
	Mat DstPic;
	erode(SrcPic, DstPic, element); //腐蝕操作
	imshow("腐蝕效果圖", DstPic);
	waitKey(0);
	return 0;
}

 

濾波操作,模糊處理

模糊處理在邊沿檢測和去噪聲方面有較為廣泛的應用。OpenCV中提供了4種模糊演算法,列舉如下:

  • average
  • median
  • gaussian
  • bilateral

這裡我們只列舉使用 均值濾波實現影象模糊:

int main()
{
	Mat SrcPic = imread("dog.jpg");
	imshow("原圖", SrcPic);
	Mat DstPic;
	blur(SrcPic, DstPic, Size(7, 7));
	imshow("均值濾波", DstPic);
	waitKey();
	return 0;
}

 

更多模糊操作見這裡

 

canny邊緣檢測

將原始影象轉化為灰度圖,用blur函式進行影象模糊以降噪,然後用canny函式進行邊緣檢測。


//canny邊緣檢測
int main()
{
	Mat SrcPic = imread("dog.jpg");
	imshow("原圖", SrcPic);
	Mat DstPic, edge, grayImage;

	//建立與src同類型和同大小的矩陣
	DstPic.create(SrcPic.size(), SrcPic.type());

	//將原始圖轉化為灰度圖
	cvtColor(SrcPic, grayImage, COLOR_BGR2GRAY);

	//先使用3*3核心來降噪
	blur(grayImage, edge, Size(3, 3));

	//執行canny運算元
	Canny(edge, edge, 3, 9, 3);

	imshow("邊緣提取效果", edge);

	waitKey();
	return 0;
}

 

直方圖均衡化

//6.直方圖均衡化
int main()
{
	Mat img = imread("dog.jpg");
	imshow("原始圖", img);
	Mat dst;
	cvtColor(img, img, CV_RGB2GRAY);
	imshow("灰度圖", img);
	equalizeHist(img, dst);

	imshow("直方圖均衡化", dst);

	waitKey(0);

}

顯然均衡化後的圖片對比度變高了,變得更加明亮!

最後簡單總結一下影象處理中概念

離散傅立葉變換

影象高頻部分代表了影象的細節、紋理資訊;低頻代表了影象的輪廓資訊

低通-》模糊

高通-》銳化

腐蝕和膨脹是針對白色部分(高亮部分)而言的。膨脹就是對影象高亮部分進行“領域擴張”,效果圖擁有比原圖更大的高亮區域;腐蝕是原圖中的高亮區域被蠶食,效果圖擁有比原圖更小的高亮區域。

開運算:先腐蝕再膨脹,用來消除小物體

閉運算:先膨脹再腐蝕,用於排除小型黑洞

形態學梯度:就是膨脹圖與腐蝕圖之差,用於保留物體的邊緣輪廓

頂帽:原影象與開運算圖之差,用於分離比鄰近點亮一些的斑塊。

黑帽:閉運算與原影象之差,用於分離比鄰近點暗一些的斑塊。