当前位置:首页 » 编程语言 » 中值滤波c语言代码
扩展阅读
webinf下怎么引入js 2023-08-31 21:54:13
堡垒机怎么打开web 2023-08-31 21:54:11

中值滤波c语言代码

发布时间: 2022-11-29 03:27:00

Ⅰ 求!中值滤波用DM642芯片实现的c语言主程序.要注释~

/*****中值滤波处理*********/
void MedianFilter()
{
int i,j,a,b;
Uint8 aValue[9],bTemp;
for(i=0;i<288;i++)
{
for(j=0;j<720;j++)
{
/*屏幕上奇数行进行处理*/
aValue[0] = (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i-1)*numPixels + (j-1)));
aValue[1] = (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i-1)*numPixels + j));
aValue[2] = (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i-1)*numPixels + (j+1)));
aValue[3] = (*(Uint8 *)(tempSrcYbuffer + i*numPixels + (j-1)));
aValue[4] = (*(Uint8 *)(tempSrcYbuffer + i*numPixels + j));
aValue[5] = (*(Uint8 *)(tempSrcYbuffer + i*numPixels + (j+1)));
aValue[6] = (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + (j-1)));
aValue[7] = (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + j));
aValue[8] = (*(Uint8 *)(tempSrcYbuffer + (numLines/2+i)*numPixels + (j+1)));

//用冒泡法对数组进行排序
for(b=0;b<8;b++)
{
for(a=0;a<8-b;a++)
{
if(aValue[a]>aValue[a+1])
{
//互换
bTemp = aValue[a];
aValue[a] = aValue[a+1];
aValue[a+1] = bTemp;
}
}
}
bTemp = aValue[4];

*(Uint8 *)(tempDisYbuffer + i*numPixels + j) = bTemp;

/*屏幕上偶数行进行处理*/
aValue[0] = (*(Uint8 *)(tempSrcYbuffer + i*numPixels + (j-1)));
aValue[1] = (*(Uint8 *)(tempSrcYbuffer + i*numPixels + j));
aValue[2] = (*(Uint8 *)(tempSrcYbuffer + i*numPixels + (j+1)));
aValue[3] = (*(Uint8 *)(tempSrcYbuffer + (i+numLines/2)*numPixels + (j-1)));
aValue[4] = (*(Uint8 *)(tempSrcYbuffer + (i+numLines/2)*numPixels + j));
aValue[5] = (*(Uint8 *)(tempSrcYbuffer + (i+numLines/2)*numPixels + (j+1)));
aValue[6] = (*(Uint8 *)(tempSrcYbuffer + (i+1)*numPixels + (j-1)));
aValue[7] = (*(Uint8 *)(tempSrcYbuffer + (i+1)*numPixels + j));
aValue[8] = (*(Uint8 *)(tempSrcYbuffer + (i+1)*numPixels + (j+1)));
//用冒泡法对数组进行排序
for(b=0;b<8;b++)
{
for(a=0;a<8-b;a++)
{
if(aValue[a]>aValue[a+1])
{
//互换
bTemp = aValue[a];
aValue[a] = aValue[a+1];
aValue[a+1] = bTemp;
}
}
}
bTemp = aValue[4];

*(Uint8 *)(tempDisYbuffer + (i+numLines/2)*numPixels + j) = bTemp;
}
}
}

Ⅱ C语言实现 一组数如 1 2 3 4 5 6 7递推中值滤波 数组长度为3

0,1,2,3,4,5} ;.0,1,2,3,4,5} ; c } ?Char a = “ string” ; ????Int a [] = “ string” ; 首先,a 是正确的,尽管数组的长度没有值,但它会自动确认数组的长度。C 的问题在于字符串的第一个地址被赋给了一个 char 变量。

Ⅲ VC中值滤波快速算法

unsigned char WINAPI GetMedianNum(unsigned char * bArray, int iFilterH,int iFilterW)
{
/* unsigned char m = mid(
mid(bArray[0],bArray[1],bArray[2]),
mid(bArray[3],bArray[4],bArray[5]),
mid(bArray[6],bArray[7],bArray[8]));
return m;*/
// 循环变量
int i;
int j;
int k;
// 中间变量
unsigned char bTemp;
int iFilterLen=iFilterH*iFilterW;
float average=0;//用于均值加速
//求均值
for (i=0;i<iFilterLen;i++)
{
average+=bArray[i];
}
average=average/iFilterLen;
unsigned char pixel_mid;
pixel_mid=bArray[(iFilterH-1)/2*iFilterW+(iFilterW-1)/2];//滤波窗口中心的取中值前的像素值

if (abs(average-pixel_mid)>10) //均值加速,其中“10”为原中值和均值之差,根据你的实际情况自行设置大小
//if(1) //不用均值加速时选此
{
//超快速中值法(本质就是伪中值法)
//行排列
if (0)
{
for (k = 0; k < iFilterH; k ++)
{
for (j = 0; j < iFilterH-1; j ++)
{
for (i = 0; i < iFilterW-1-j; i++)
{
number++;
if (bArray[i+iFilterH*k] > bArray[i+iFilterH*k+1])
{ // 互换
bTemp = bArray[i+iFilterH*k];
bArray[i+iFilterH*k] = bArray[i+iFilterH*k+1];
bArray[i+iFilterH*k+1] = bTemp;
}
}

还有什么疑问,把邮箱发给我。

Ⅳ 用C++语言实现中值滤波

这个filter是用来平滑图像用的,简单来说是对一幅(width * height)大小的图像按下述方法进行平滑化,以达到除去图像中噪声的目的。

首先把输入图像中每个像素点和该像素点四周的8个像素点作为一组来看,将这9个像素点的灰度进行排序后取最中间的那个灰度值作为这个像素点平滑化后的灰度值。

参数corrupted用来指向一幅有噪声的图像空间,参数smooth用来指向平滑化处理后的图像空间,width和height分别为图像的宽和高。


那么做main函数就应该知道怎么写了才对。

如果你能读入一幅图像并把图像里的各像素点保存到一个unsigned char数组里是最好的,不能的话可以自己虚构一幅图像来尝试滤波。


比如我们有下述5*5大小的图像(灰度范围0-255):

static unsigned char image[] = {

50, 50, 50, 50, 50,

50, 52, 48, 50, 50,

50, 50, 50, 0, 50,

50, 48, 53, 50, 50,

50, 50, 50, 50, 50,

};

本来这幅图像应该是全灰度为50的图像,但是现在某些像素点混入了噪声(非50的像素点即为噪声)

把它送入medianFilter后即可得到平滑化后的全灰度为50的图像。


参考代码:

#include<memory.h>
#include<stdio.h>

staticunsignedcharimage[]={
50,50,50,50,50,
50,52,48,50,50,
50,50,50,0,50,
50,48,53,50,50,
50,50,50,50,50,
};
#defineWIDTH5
#defineHEIGHT5

voidmedianFilter(unsignedchar*corrupted,unsignedchar*smooth,intwidth,intheight)
{
memcpy(smooth,corrupted,width*height*sizeof(unsignedchar));
for(intj=1;j<height-1;j++)
{
for(inti=1;i<width-1;i++)
{
intk=0;
unsignedcharwindow[9];
for(intjj=j-1;jj<j+2;++jj)
for(intii=i-1;ii<i+2;++ii)
window[k++]=corrupted[jj*width+ii];
//Orderelements(onlyhalfofthem)
for(intm=0;m<5;++m)
{
intmin=m;
for(intn=m+1;n<9;++n)
if(window[n]<window[min])
min=n;
//
unsignedchartemp=window[m];
window[m]=window[min];
window[min]=temp;
}
smooth[j*width+i]=window[4];
}
}
}

intmain()
{
unsignedcharoutput[WIDTH*HEIGHT];
inti,j;
medianFilter(image,output,WIDTH,HEIGHT);
for(i=0;i<HEIGHT;i++)
{
for(j=0;j<WIDTH;j++)
{
printf("%d ",output[i*WIDTH+j]);
}
printf(" ");
}
return0;
}

Ⅳ 中值滤波

一. 中值滤波:

    中值滤波器是一种可以使图像平滑的滤波器。它使用滤波器范围内的像素的中值去代表该范围内所有的像素。中值滤波是消除图像噪声最常见的手段之一,特别是消除椒盐噪声,中值滤波的效果要比均值滤波更好。

二. python实现中值滤波和均值滤波,并用两种滤波器对受到椒盐噪声污染的图像进行去噪

import cv2

import numpy as np

# Median filter

def median_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.().astype(np.float)

    tmp = out.()

    # filtering

    for y in range(H):

        for x in range(W):

            for c in range(C):

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

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

    return out

# Average filter

def average_filter(img, G=3):

    out = img.()

    H, W, C = img.shape

    Nh = int(H / G)

    Nw = int(W / G)

    for y in range(Nh):

        for x in range(Nw):

            for c in range(C):

                out[G*y:G*(y+1), G*x:G*(x+1), c] = np.mean(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)

    return out

# Read image

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

# Median Filter and Average Filter

out1 = median_filter(img, K_size=3)

out2 = average_filter(img,G=3)

# Save result

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

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

cv2.waitKey(0)

cv2.destroyAllWindows()

三. 实验结果

        可以明显看出,对于受到椒盐噪声污染的图像,中值滤波往往比均值滤波的去噪效果要好!

四. 参考内容:

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

Ⅵ c语言中值滤波问题

1. 是规定做中值滤波的点不含边缘的点(取决于中值滤波窗口大小)。 2,对图像边缘部分的信息进行镜像处理。

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

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

intnByteWidth=nWidth*3;
if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4);
BYTEp[9],s;
inti,j;
for(y=1;y<nHeight-1;y++)
{
for(x=3;x<nWidth*3-3;x++)
{
//把一个像素周围的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=0;j<5;j++)
{
for(i=j+1;i<9;i++)
{
if(p[j]>p[i])
{
s=p[j];
p[j]=p[i];
p[i]=s;
}
}
}
//将各点的中值赋值给该像素
lpOutput[x+y*nByteWidth]=p[4];
}

//----------------------------------------
intsr,sg,sb;
intnByteWidth=nWidth*3;
if(nByteWidth%4)nByteWidth+=4-(nByteWidth%4);
for(y=1;y<nHeight-1;y++)
{
for(x=1;x<nWidth-1;x++)
{
p=x*3+y*nByteWidth;
sb=0;
sg=0;
sr=0;
for(y1=-1;y1<=1;y1++)
for(x1=-1;x1<=1;x1++)
{
//像素本身及其周围的八个像素(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;
}
}

Ⅷ 如何用visual studio 的C++写中值滤波器

使用visual studio 2010编写一个c++程序:
1、创建项目,可以通过菜单:文件-新建-项目;也可以通过工具栏点击新建项目进行创建。这里点击起始页面上面的新建项目:

2、点击之后进入新建项目向导:

3、上面选择Win32控制台应用程序,名称中输入HelloWorld点确定,至于是否为解决方案创建目录我们暂时不管,那主要区别在于解决方案是否和项目文件在同一目录。

4、 接下来进入创建页面,在Win32应用程序向导的第一个页面直接点下一步即可:

5、下个页面记得选择空项目,因为不需要预编译头:

6、点击完成。 这时候一个空的项目编译成功了,不妨编译一些试试。点击刚才添加的生成工具栏的生成按钮:

7、添加代码:

8、在向导中选择代码、C++文件(.cpp),名称输入Main,确定。

9、输入最简单的几行代码,然后编译它:

10、用Ctrl+F5或者点那个空心三角形运行结果:

Ⅸ 怎样写数字滤波程序

可以告诉你方法:算数平均滤波,就是求出k次采样值的总和,再除以k;中值滤波法,是把k个采样值按照从小到大排列顺序,然后找到位于最中间的那个值;最后一种不知道你们老师的防脉冲是什么意思,猜测可能是去掉k次采样值中大于或小于某个值,剩余值求平均数。
让别人免费给你写程序基本上不可能,这个得花时间和精力。

Ⅹ 求大神,c语言的一个矩阵相乘(两个3*3的矩阵),中值滤波问题

按照题目要求写如下代码,后面附结果,如果满意,望采纳!
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
doubleA[3][16]={160,163,167,80,83,85,155,158,159,20,22,23,170,173,176,179,
159,158,155,75,78,80,156,159,153,25,23,21,167,168,166,164,
153,155,157,81,84,82,154,153,158,27,25,24,168,172,171,170};

doublemask[3][3]={1,2,1,
2,4,2,
1,2,1};

voidmyfilter(double*p)
{
inti,j;
for(i=1;i<=14;++i)
{
/*code*/
doublesum=0;
for(j=0;j<3;++j)
{
sum+=A[j][i-1]*mask[j][0]+A[j][i]*mask[j][1]+A[j][i+1]*mask[j][2];
}
//printf("sum=%lf ",sum);
*p++=sum/16;
}
return;
}

intmain(intargc,charconst*argv[])
{
/*code*/
doubleans[14];
double*p=ans;
myfilter(p);
inti;
for(i=0;i<14;++i)
{
printf("%.4lf ",ans[i]);
}
printf(" ");
system("pause");
return0;
}