求解这段C语言程序什么意思

求解这段C语言程序什么意思,第1张

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

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

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

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

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

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

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

一. 均值滤波简介和原理

     晌扒   均值滤波,是图像处理中常用的手段,从频率域观点来看均值滤波是一种低通滤波器,高频信号将会去掉。均值滤波可以帮助消除图像尖锐噪声,实现图像平滑,模糊等功能。理想的均值滤波是用每个像素和它周围像素计算出来岁蠢的平均值替换图像中每个像素。

        以3*3均值滤波器为例,均值滤波器算法宴雀昌原理如下图:

二. 用均值滤波器对椒盐噪声污染后的图像去噪

        python 源码:

import cv2

import numpy as np

# mean filter

def mean_filter(img, K_size=3):

    H, W, C = img.shape

    # zero padding

    pad = K_size // 2

    out = np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float)

    out[pad: pad + H, pad: pad + W] = img.copy().astype(np.float)

    tmp = out.copy()

    # filtering

    for y in range(H):

        for x in range(W):

            for c in range(C):

                out[pad + y, pad + x, c] = np.mean(tmp[y: y + K_size, x: x + K_size, c])

    out = out[pad: pad + H, pad: pad + W].astype(np.uint8)

    return out

# Read image

img = cv2.imread("../paojie_sp1.jpg")

# Mean Filter

out = mean_filter(img, K_size=5)

# Save result

cv2.imwrite("out.jpg", out)

cv2.imshow("result", out)

cv2.waitKey(0)

cv2.destroyAllWindows()

三. 实验结果:

        可以看到,均值滤波后,图像中噪声虽然有所减弱,但是图像变模糊了。因为均值滤波器过滤掉了图像中的高频分量,所以图像的边缘都变模糊了。(去除一定量椒盐噪声,可以考虑使用中值滤波)

四. 参考内容:

        https://www.cnblogs.com/wojianxin/p/12501891.html

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

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

}

}


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

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

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

发表评论

登录后才能评论

评论列表(0条)

保存