Ⅰ 求!中值濾波用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;
}