使用C++代码完成 均值滤波器、中值滤波器、最大值滤波器、最小值滤波器分别对灰度图进行滤波

使用C++代码完成 均值滤波器、中值滤波器、最大值滤波器、最小值滤波器分别对灰度图进行滤波,第1张

//中值滤波和均值大概这个样子

int nByteWidth=nWidth*3

if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4)

BYTE p[9],s

int i,j

for(y=1y<nHeight-1y++)

{

for(x=3x<nWidth*3-3x++)

{

//把一个像素周围的8个像素值分别赋值给p[0]到p[8]

p[0]=lpInput[x-3+(y-1)*nByteWidth]

p[1]=lpInput[x+(y-1)*nByteWidth]

p[2]=lpInput[x+3+(y-1)*nByteWidth]

p[3]=lpInput[x-3+y*nByteWidth]

p[4]=lpInput[x+y*nByteWidth]

p[5]=lpInput[x+3+y*nByteWidth]

p[6]=lpInput[x-3+(y+1)*nByteWidth]

p[7]=lpInput[x+(y+1)*nByteWidth]

p[8]=lpInput[x+3+(y+1)*nByteWidth]

//将p[0]到p[8]从小到大排列

for(j=0j<5j++)

{

for(i=j+1i<9i++)

{

if (p[j]>p[i])

{

s=p[j]

p[j]=p[i]

p[i]=s

}

}

}

//将各点的中值赋值给该像素

lpOutput[x+y*nByteWidth]=p[4]

}

//----------------------------------------

int sr,sg,sb

int nByteWidth=nWidth*3

if (nByteWidth%4) nByteWidth+=4-(nByteWidth%4)

for(y=1y<nHeight-1y++)

{

for(x=1x<nWidth-1x++)

{

p=x*3+y*nByteWidth

sb=0

sg=0

sr=0

for(y1=-1y1<=1y1++)

for(x1=-1x1<=1x1++)

{

//像素本身及其周围的八个像素(3X3窗口内的像素)的blue值之和

sb+=lpInput[(y+y1)*nByteWidth+(x+x1)*3]

//像素本身及其周围的八个像素(3X3窗口内的像素)的green值之和

sg+=lpInput[(y+y1)*nByteWidth+(x+x1)*3+1]

//像素本身及其周围的八个像素(3X3窗口内的像素)的red值之和

sr+=lpInput[(y+y1)*nByteWidth+(x+x1)*3+2]

}

//将red,green,blue值的平均值赋值给该像素

lpOutput[p+2]=sr/9

lpOutput[p+1]=sg/9

lpOutput[p]=sb/9

}

}

由于没有上下文,只能进行以下猜测:

-图象幅面宽度为640,高度480,象素宽度为24位,实际占用32位;

-pMem可能是每个单元(32位)存放一个象素;

-RGB是将三个字节组合成一个象素24位,BGR是将RGB顺序的图象象素中红和蓝的字节调换;

-前面一个循环将图象第3行到477行进行均值滤波,滤波方式是将该象素附近8个点与此象素求和再除以9得到平均值;

-后面一个循环是将图象未做滤波的几行填充成白色;

-图象处理算法可能存在问题:应该利用双存储区进行运算,结果为了节省内存导致均值运算会得不到正确运算,比如我们计算屏幕中心点的均值时,取到的左边一个象素、整个上面的3个象素均已经被之前的均值运算结果覆盖了,不是原来的象素数据了。也可能是利用高位未使用的字节存放的处理结果?由于没有RGB的定义无法判断。

  均值滤波是指用当前像素点周围N·N个像素值的均值来代替当前像素值。使用该方法遍历处理图像内的每一个像素点,即可完成整幅图像的均值滤波。

例如,希望对图7-7中位于第5行第5列的像素点进行均值滤波。

根据上述运算,针对每一个像素点,都是与一个内部值均为1/25的5×5矩阵相乘,得到均值滤波的计算结果,如图7-11所示。

将使用的5×5矩阵一般化,可以得到如图7-12所示的结果。

式中,M和N分别对应高度和宽度。一般情况下,M和N是相等的,例如比较常用的3×3、5×5、7×7等。如果M和N的值越大,参与运算的像素点数量就越多,图像失真越严重。

在OpenCV中,实现均值滤波的函数是cv2.blur(),其语法格式为:

式中:

通常情况下,使用均值滤波函数时,对于锚点anchor和边界样式borderType,直接采用其默认值即可。

【例7.2】针对噪声图像,使用不同大小的卷积核对其进行均值滤波,并显示均值滤波的情况。

  从图中可以看出,使用5×5的卷积核进行滤波处理时,图像的失真不明显;而使用30×30的卷积核进行滤波处理时,图像的失真情况较明显。

  卷积核越大,参与到均值运算中的像素就会越多,即当前点计算的是更多点的像素值的平均值。因此,卷积核越大,去噪效果越好,当然花费的计算时间也会越长,同时让图像失真越严重。在实际处理中,要在失真和去噪效果之间取得平衡,选取合适大小的卷积核。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/11172344.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-14
下一篇 2023-05-14

发表评论

登录后才能评论

评论列表(0条)

保存