itk、OpenCV 圖像的幾種預處理方法(直方圖均衡化、中值濾波、Laplacian邊緣提取)及自己的理解

1、直方圖均衡化

把集中分佈的像素範圍擴大,使像素分佈更加均衡,起到增強的作用。至itk5沒有現成函數,以下是實現代碼:

void image_enhance_grayhis(InternalImageType::Pointer image, InternalImageType::Pointer OriImage)
{
	
	int width = image->GetLargestPossibleRegion().GetSize()[0];
	int heigth = image->GetLargestPossibleRegion().GetSize()[1];

	unsigned int his[256] = { 0 };
	float p_hist[256] = { 0 };
	float s_hist[256] = { 0 };
	float total = width * heigth;

	for (int i = 0; i < width; i++)
	{
		for (int j = 0; j < heigth; j++)
		{

			int nPixel = fPixel;
			if (nPixel < 0)
				nPixel = 0;
			else if (nPixel > 255)
				nPixel = 255;
			his[nPixel]++;
		}
	}
		
	for (int i = 0; i < 256; i++)
	{
		p_hist[i] = (float)his[i] / total;
		if (i == 0)s_hist[i] = p_hist[i];
		else s_hist[i] = s_hist[i - 1] + p_hist[i];
	}

	InternalImageType::IndexType pixelIndex;
	float fPrePixel;
	int nPrePixel;
	float nPreValue;
	for (int i = 0; i < width; i++)
		for (int j = 0; j < heigth; j++)
		{
			
			pixelIndex[0] = i;
			pixelIndex[1] = j;

			fPrePixel = image->GetPixel(pixelIndex);
			nPrePixel = fPrePixel;
			if (nPrePixel < 0)
				nPrePixel = 0;
			else if (nPrePixel > 255)
				nPrePixel = 255;

			nPreValue =int( s_hist[nPrePixel] * 255 + 0.5);
			image->SetPixel(pixelIndex, nPreValue);
		}
}

2、中值濾波

是一種非線性平滑技術,它將每一像素點的灰度值設置爲該點某鄰域窗口內的所有像素點灰度值的中值。

中值濾波是基於排序統計理論的一種能有效抑制噪聲的非線性信號處理技術,中值濾波的基本原理是把數字圖像或數字序列中一點的值用該點的一個鄰域中各點值的中值代替,讓周圍的素點值接近的真實值,從而消除孤立的噪聲點。方法是用某種結構的二維滑動模板,將板內素點按照像素值的大小進行排序,生成單調上升(或下降)的爲二維數據序列。二維中值濾波輸出爲g(x,y)=med{f(x-k,y-l),(k,l∈W)} ,其中,f(x,y),g(x,y)分別爲原始圖像和處理後圖像。W爲二維模板,通常爲3*3,5*5區域,也可以是不同的的形狀,如線狀,圓形,十字形,圓環形等。中值濾波不改變圖像的像素值範圍。ITK 實現:

using MedianFilterType = itk::MedianImageFilter<InternalImageType, InternalImageType> ;
MedianFilterType::Pointer pMedianFilter = MedianFilterType::New();
MedianFilter->SetRadius(3);
MedianFilter->SetInput(movingImage);
MedianFilter->Update();
MedianFilter= MedianFilter->GetOutput();

效果:

3、Laplacian 邊緣提取

void edgeEnhance(cv::Mat& srcImg, cv::Mat& dstImg)
{
	if (!dstImg.empty())
	{
		dstImg.release();
	}
	    cv::Mat srcImg8U;
		cv::Mat sharpMat8U;
		cv::Mat sharpMat;
		cv::Mat blurMat;
		srcImg.convertTo(srcImg8U, CV_8U);
		
		cv::GaussianBlur(srcImg8U, blurMat, cv::Size(3, 3), 0, 0);

		cv::Laplacian(blurMat, dstImg, CV_8U);//提取邊緣
		//dstImg = dstImg*10 ;
		//dstImg.convertTo(dstImg, CV_8U);
		cv::add(srcImg8U, dstImg, dstImg);//增強
}

 

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