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);//增强
}

 

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