空域的平滑

第1关:邻域平均法


#include "BMP.h"


BMP_Image* MeanFilter(BMP_Image* Image_In)
{

    BMP_Image* Image_MeanFilter;
  	Image_MeanFilter = (BMP_Image*)malloc(sizeof(BMP_Image));

    Image_MeanFilter->width = Image_In->width -2;
    Image_MeanFilter->height = Image_In->height -2;
	Image_MeanFilter->biBitCount = 8;
	Image_MeanFilter->imageRgbQuad = (BMP_RgbQuad*)malloc(sizeof(BMP_RgbQuad)*256);
	Image_MeanFilter->imageData = 	(unsigned char*)malloc((Image_In->height-2)*(Image_In->width-2));

    int i;
    for(i=0;i<256;i++)
	{
	 Image_MeanFilter->imageRgbQuad[i].rgbBlue =     Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MeanFilter->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MeanFilter->imageRgbQuad[i].rgbRed = 	 Image_In->imageRgbQuad[i].rgbRed;
	 Image_MeanFilter->imageRgbQuad[i].rgbReserved = 0;

	 Image_MeanFilter->imageRgbQuad[i].rgbBlue = 	 Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MeanFilter->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MeanFilter->imageRgbQuad[i].rgbRed =	     Image_In->imageRgbQuad[i].rgbRed;
	 Image_MeanFilter->imageRgbQuad[i].rgbReserved = 0;

	 Image_MeanFilter->imageRgbQuad[i].rgbBlue = 	 Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MeanFilter->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MeanFilter->imageRgbQuad[i].rgbRed = 	 Image_In->imageRgbQuad[i].rgbRed;
	 Image_MeanFilter->imageRgbQuad[i].rgbReserved = 0;

	}

//Â˲¨²Ù×÷ʱ²»¿¼ÂDZßÔµ£¬3*3¾ùÖµÂ˲¨µÄ»°»áʹͼÏñ¼õÉÙ2ÐÐ2ÁÐ
//ÔÚÂ˲¨Ê±Ó¦´ÓµÚ¶þÐеڶþÁпªÊ¼µ½µ¹ÊýµÚ¶þÐеڶþÁнáÊø

    int j,index1,index2,index3,k=0,tmp;

    for (i=1; i<Image_In->height-1; i++)
    {
      for (j=1; j<Image_In->width-1; j++)
        {
		  /********* Begin *********/

            index1 = (i-1)*Image_In->width+j;
            index2 = i*Image_In->width+j;
            index3 = (i+1)*Image_In->width+j;
            tmp = (Image_In->imageData[index1-1] + Image_In->imageData[index1] + Image_In->imageData[index1+1] + Image_In->imageData[index2-1] + Image_In->imageData[index2]  +  Image_In->imageData[index2+1]  +
            Image_In->imageData[index3-1] + Image_In->imageData[index3] + Image_In->imageData[index3+1])/9;
            Image_MeanFilter->imageData[k] = tmp;
            k++;


		  /********* End *********/
	  }
	}
    return Image_MeanFilter;
}

第2关:中值滤波法(3*3)


#include "BMP.h"

int Med(int a,int b,int c)
{
int t;
if(a > b) {t = a; a=b; b=t;}
if(a > c) {t = a; a=c; c=t;}
if(b > c) {t = b; b=c; c=t;}

return b;
}

BMP_Image* MedFilter(BMP_Image* Image_In)
{

    BMP_Image* Image_MedFilter;
  	Image_MedFilter = (BMP_Image*)malloc(sizeof(BMP_Image));


    Image_MedFilter->width = Image_In->width -2;
    Image_MedFilter->height = Image_In->height -2;
	Image_MedFilter->biBitCount = 8;
	Image_MedFilter->imageRgbQuad = (BMP_RgbQuad*)malloc(sizeof(BMP_RgbQuad)*256);
	Image_MedFilter->imageData = 	(unsigned char*)malloc((Image_In->height-2)*(Image_In->width-2));

    int i;
    for(i=0;i<256;i++)
	{

	 Image_MedFilter->imageRgbQuad[i].rgbBlue =      Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MedFilter->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MedFilter->imageRgbQuad[i].rgbRed = 	     Image_In->imageRgbQuad[i].rgbRed;
	 Image_MedFilter->imageRgbQuad[i].rgbReserved =  0;

	 Image_MedFilter->imageRgbQuad[i].rgbBlue = 	 Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MedFilter->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MedFilter->imageRgbQuad[i].rgbRed =	     Image_In->imageRgbQuad[i].rgbRed;
	 Image_MedFilter->imageRgbQuad[i].rgbReserved =  0;

	 Image_MedFilter->imageRgbQuad[i].rgbBlue = 	 Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MedFilter->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MedFilter->imageRgbQuad[i].rgbRed = 	     Image_In->imageRgbQuad[i].rgbRed;
	 Image_MedFilter->imageRgbQuad[i].rgbReserved =  0;

	}

//Â˲¨²Ù×÷ʱ²»¿¼ÂDZßÔµ£¬3*3ÖÐÖµÂ˲¨µÄ»°»áʹͼÏñ¼õÉÙ2ÐÐ2ÁÐ
//ÔÚÂ˲¨Ê±Ó¦´ÓµÚ¶þÐеڶþÁпªÊ¼µ½µ¹ÊýµÚ¶þÐеڶþÁнáÊø

    int j,index1,index2,index3,k=0;

    for (i=1; i<Image_In->height-1; i++)
    {
      for (j=1; j<Image_In->width-1; j++)
        {
		  /********* Begin *********/
            index1=(i-1)*Image_In->width+j;
            index2=i*Image_In->width+j;
            index3=(i+1)*Image_In->width+j;
            int Med1 = Med(Image_In->imageData[index1-1],Image_In->imageData[index1],Image_In->imageData[index1+1]);
            int Med2 = Med(Image_In->imageData[index2-1],Image_In->imageData[index2],Image_In->imageData[index2+1]);
            int Med3 = Med(Image_In->imageData[index3-1],Image_In->imageData[index3],Image_In->imageData[index3+1]);
            int Med4 = Med(Med1,Med2,Med3);
            Image_MedFilter->imageData[k] = Med4;
            k++;



		  /********* End *********/
	  }
	}
    return Image_MedFilter;
}

第3关:中值滤波法(5*5)


#include "BMP.h"
//Èý¸öÊýÇóÖÐÖµ
int ForMed(int a,int b,int c)
{
int t;
if(a > b) {t = a; a=b; b=t;}
if(a > c) {t = a; a=c; c=t;}
if(b > c) {t = b; b=c; c=t;}

return b;
}

BMP_Image* MedFilter1(BMP_Image* Image_In)
{

    BMP_Image* Image_MedFilter1;
  	Image_MedFilter1 = (BMP_Image*)malloc(sizeof(BMP_Image));

    Image_MedFilter1->width = Image_In->width -4;
    Image_MedFilter1->height = Image_In->height -4;
	Image_MedFilter1->biBitCount = 8;
	Image_MedFilter1->imageRgbQuad = (BMP_RgbQuad*)malloc(sizeof(BMP_RgbQuad)*256);
	Image_MedFilter1->imageData = 	(unsigned char*)malloc((Image_In->height-4)*(Image_In->width-4));

    int i;
    for(i=0;i<256;i++)
	{

	 Image_MedFilter1->imageRgbQuad[i].rgbBlue =      Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MedFilter1->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MedFilter1->imageRgbQuad[i].rgbRed = 	     Image_In->imageRgbQuad[i].rgbRed;
	 Image_MedFilter1->imageRgbQuad[i].rgbReserved =  0;

	 Image_MedFilter1->imageRgbQuad[i].rgbBlue = 	 Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MedFilter1->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MedFilter1->imageRgbQuad[i].rgbRed =	     Image_In->imageRgbQuad[i].rgbRed;
	 Image_MedFilter1->imageRgbQuad[i].rgbReserved =  0;

	 Image_MedFilter1->imageRgbQuad[i].rgbBlue = 	 Image_In->imageRgbQuad[i].rgbBlue;
	 Image_MedFilter1->imageRgbQuad[i].rgbGreen = 	 Image_In->imageRgbQuad[i].rgbGreen;
	 Image_MedFilter1->imageRgbQuad[i].rgbRed = 	     Image_In->imageRgbQuad[i].rgbRed;
	 Image_MedFilter1->imageRgbQuad[i].rgbReserved =  0;

	}

    int j,index1,index2,index3,index4,index5,k=0;
//Â˲¨²Ù×÷ʱ²»¿¼ÂDZßÔµ£¬5*5ÖÐÖµÂ˲¨µÄ»°»áʹͼÏñ¼õÉÙ4ÐÐ4ÁÐ
//ÔÚÂ˲¨Ê±Ó¦´ÓµÚÈýÐеÚÈýÁпªÊ¼µ½µ¹ÊýµÚÈýÐеÚÈýÁнáÊø
    for (i=2; i<Image_In->height-2; i++)
    {
      for (j=2; j<Image_In->width-2; j++)
        {
		  /********* Begin *********/
            index1=(i-2)*Image_In->width+j;
            index2=(i-1)*Image_In->width+j;
            index3=i*Image_In->width+j;
            index4=(i+1)*Image_In->width+j;
            index5=(i+2)*Image_In->width+j;
            int Med1 = ForMed(Image_In->imageData[index1-1],Image_In->imageData[index1],Image_In->imageData[index1+1]);
            int Med2 = ForMed(Image_In->imageData[index2-1],Image_In->imageData[index2],Image_In->imageData[index2+1]);
            int Med3 = ForMed(Image_In->imageData[index3-1],Image_In->imageData[index3],Image_In->imageData[index3+1]);
            int Med4 = ForMed(Image_In->imageData[index4-1],Image_In->imageData[index4],Image_In->imageData[index4+1]);
            int Med5 = ForMed(Image_In->imageData[index5-1],Image_In->imageData[index5],Image_In->imageData[index5+1]);
            int Med6= ForMed(Med1,Med2,Med3);
            int Med7= ForMed(Med4,Med5,Med6);
            Image_MedFilter1->imageData[k] = Med7;
            k++;



		  /********* End *********/
	  }
	}
    return Image_MedFilter1;
}

### Matlab 中实现图像空域平滑的方法 #### 空域平滑的基本概念 空域平滑是一种通过减少图像中的高频成分(如噪声)来改善视觉质量的技术。其核心思想是对图像的每个像素及其邻域进行某种形式的操作,使得局部变化更加平稳[^4]。 #### 平滑滤波器的工作机制 在空域中,平滑滤波通常利用模板卷积的方式完成。具体来说,对于输入图像 \( f(x, y) \),输出图像 \( g(x, y) \) 的计算公式为: \[ g(x, y) = \sum_{r=-a}^{a}\sum_{s=-b}^{b} H(r, s)f(x+r, y+s) \] 其中,\( H(r, s) \) 是滤波器模板的系数矩阵,而 \( a \) 和 \( b \) 则由模板尺寸决定。常用的滤波器包括均值滤波器和中值滤波器。 --- #### 均值滤波器 (Mean Filter) ##### 工作原理 均值滤波器通过对目标像素周围的像素求平均值来降低随机噪声的影响。它适用于去除加性高斯白噪声的情况[^3]。 ##### MATLAB 实现代码 以下是基于 `conv2` 函数的均值滤波器实现示例: ```matlab function img_filtered = mean_filter(img, window_size) h = ones(window_size)/window_size^2; % 创建均值滤波核 img_filtered = conv2(double(img), h, &#39;same&#39;); % 卷积操作 end ``` 调用该函数时,可以通过指定窗口大小来自定义滤波效果。例如: ```matlab img_noisy = imread(&#39;noisy_image.png&#39;); img_smoothed = mean_filter(rgb2gray(img_noisy), 5); imshow(uint8(img_smoothed)); ``` --- #### 中值滤波器 (Median Filter) ##### 工作原理 中值滤波器通过选取目标像素周围区域的中间值作为新像素值,能够有效保留边缘细节的同时消除脉冲噪声。 ##### MATLAB 实现代码 MATLAB 提供了内置函数 `medfilt2` 来快速实现中值滤波功能。如果需要自定义实现,则可按以下方式编写代码: ```matlab function img_filtered = median_filter(img, window_size) padSize = floor(window_size / 2); paddedImg = padarray(double(img), [padSize, padSize], &#39;replicate&#39;); [rows, cols] = size(paddedImg); img_filtered = zeros(size(img)); for i = 1:size(img, 1) for j = 1:size(img, 2) region = paddedImg(i:i+window_size-1, j:j+window_size-1); img_filtered(i,j) = median(region(:)); % 计算中位数 end end end ``` 调用此函数同样简单明了: ```matlab img_noisy = imread(&#39;salt_pepper_noise_image.png&#39;); img_smoothed = median_filter(rgb2gray(img_noisy), 3); imshow(uint8(img_smoothed)); ``` --- #### 不同窗口大小对结果的影响 随着窗口尺寸增大,滤波器的作用范围也扩大,这可能导致更多的细节丢失以及更明显的模糊效应。因此,在实际应用中需权衡去噪能力和保持图像特征的需求。 --- ### 总结 无论是均值还是中值滤波器,它们都属于经典的空域平滑技术,并已在多个领域得到了广泛应用。然而需要注意的是,这些方法各有优劣——前者更适合于均匀分布型噪音环境,后者则针对稀疏尖峰干扰更为高效[^5]。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值