天天看点

[图像处理]图像的平滑处理

空间滤波:某些邻域处理工作是操作邻域的图像像素值以及相应的雨邻域有相同维数的子图像的值,这些子图像可以被称为滤波器、掩摸、核。在滤波器子图像中的值使系数值,而不是像素值。

线性平滑:对于每一个像素点的灰度值用它的邻域值来代替,其邻域的大小为:N*N,N一般取奇数。线性平滑虽然降低了噪声,但同时也模糊了图像的边缘和细节,这是这一类滤波器的通病。

非线性平滑:不对所有像素都用他的邻域平均值来代替,而是取一个阈值,当像素灰度值与其邻域平均值之差大于已知的阈值时,才用均值来代替。

邻域平均法的3x3模板:

           1 1 1                    1   2   1

1/8  ( 1 1 1)     1/16 (2  4   2)   

            1 1 1                   1    2   1

其中第二种模板的权重不相同,其目的就是为了突出中心点的重要性,所以其权值比较大。

模板选择的越大,则噪声减小的就越明显。

{
	int avg = 0;
	BYTE * m_pdata;
	int width, height;
	m_pdata = getData();
	width = getWidth();
	height = getHeight();
	BYTE* temp = new BYTE[width *height];
	memset(temp, 255, width*height);
	for (int j = 1; j<height - 1; j++)
		for (int i = 1; i < width - 1; i++)
		{
			avg = (int)((m_pdata[(j - 1)*width + (i - 1)] + m_pdata[(j - 1)*width + i] + m_pdata[(j - 1)*width + (i + 1)]
				+ m_pdata[j*width + (i - 1)] + m_pdata[j*width + (i + 1)] + m_pdata[(j + 1)*width + (i - 1)] + m_pdata[(j + 1)*width + i]
				+ m_pdata[(j + 1)*width + (i + 1)]) / 8);
			temp[width*j + i] = avg;
			
		}
	memcpy(m_pdata, temp, width*height);
	delete temp;
} 
           

中值滤波:

中值滤波是一种非线性滤波,与其对应的中值滤波器也是一种非线性滤波器,中值滤波一般采用一个含有奇数个点的滑动窗口,将窗口中各点的灰度值的种植来替代指定点的灰度值。

二维中值滤波的窗口形状和尺寸设计对于滤波的影响较大。

if (n >= 3 && n % 2 == 1)
	{
		BYTE * temp = new BYTE[width*height];
		memset(temp, 255, width*height);
		n2 = (n - 1) / 2;
		int chou = (n+n-1) / 2;
		for(int j=n2;j<=height-n2;j++)
			for (int i = n2; i < width - n2; i++)
			{
				int m = 0;
				for (int yy = j - n2; yy <= j + n2; yy++)
				{
					modo[m++] = p_data[yy*width + i];
				}
				for (int xx = i - n2; xx <= i + n2; xx++)
				{
					modo[m++] = p_data[j*width + xx];
				}
				std::sort(modo, modo + m);
				medi = modo[chou];
				temp[j*width + i] = medi;
			}
		memcpy(p_data, temp, width*height);
		delete temp;
	}
           

继续阅读