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
}
}
这个可比你想象晌大的复杂多了,s是个复变量,1/(s+1)极点在-1,要想用C语言写,必须理解清楚下面几个问题:1、输入必须是个有限序列,比如(x+yi),x和y分别是两个长度为N的数组
2、要过滤的频率,必须是个整型值,或者是个整型区间
3、输出大前结果同样是两个长度为N的数组(p+qi)
4、整个程宴仿竖序需要使用最基本的复数运算,这一点C语言本身不提供,必须手工写复函数运算库
5、实现的时候具体算法还需要编,这里才是你问题的核心。
我可以送你一段FFT的程序,自己琢磨吧,和MATLAB的概念差别很大:
#include <assert.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <windows.h>
#include "complex.h"
extern "C" {
// Discrete Fourier Transform (Basic Version, Without Any Enhancement)
// return - Without Special Meaning, constantly, zero
int DFT (long count, CComplex * input, CComplex * output)
{
assert(count)
assert(input)
assert(output)
CComplex F, X, T, Wint n, i
long N = abs(count)long Inversing = count <0? 1: -1
for(n = 0n <N n++){ // compute from line 0 to N-1
F = CComplex(0.0f, 0.0f)// clear a line
for(i = 0i <Ni++) {
T = input[i]
W = HarmonicPI2(Inversing * n * i, N)
X = T * W
F += X// fininshing a line
}//next i
// save data to outpus
memcpy(output + n, &F, sizeof(F))
}//next n
return 0
}//end DFT
int fft (long count, CComplex * input, CComplex * output)
{
assert(count)
assert(input)
assert(output)
int N = abs(count)long Inversing = count <0? -1: 1
if (N % 2 || N <5) return DFT(count, input, output)
long N2 = N / 2
CComplex * iEven = new CComplex[N2]memset(iEven, 0, sizeof(CComplex) * N2)
CComplex * oEven = new CComplex[N2]memset(oEven, 0, sizeof(CComplex) * N2)
CComplex * iOdd = new CComplex[N2]memset(iOdd , 0, sizeof(CComplex) * N2)
CComplex * oOdd = new CComplex[N2]memset(oOdd , 0, sizeof(CComplex) * N2)
int i = 0CComplex W
for(i = 0i <N2i++) {
iEven[i] = input[i * 2]
iOdd [i] = input[i * 2 + 1]
}//next i
fft(N2 * Inversing, iEven, oEven)
fft(N2 * Inversing, iOdd, oOdd )
for(i = 0i <N2i++) {
W = HarmonicPI2(Inversing * (- i), N)
output[i] = oEven[i] + W * oOdd[i]
output[i + N2] = oEven[i] - W * oOdd[i]
}//next i
return 0
}//end FFT
void __stdcall FFT(
long N, // Serial Length, N >0 for DFT, N <0 for iDFT - inversed Discrete Fourier Transform
double * inputReal, double * inputImaginary, // inputs
double * AmplitudeFrequences, double * PhaseFrequences) // outputs
{
if (N == 0) return
if (!inputReal &&!inputImaginary) return
short n = abs(N)
CComplex * input = new CComplex[n]memset(input, 0, sizeof(CComplex) * n)
CComplex * output= new CComplex[n]memset(output,0, sizeof(CComplex) * n)
double rl = 0.0f, im = 0.0fint i = 0
for (i = 0i <ni++) {
rl = 0.0fim = 0.0f
if (inputReal) rl = inputReal[i]
if (inputImaginary) im = inputImaginary[i]
input[i] = CComplex(rl, im)
}//next i
int f = fft(N, input, output)
double factor = n
//factor = sqrt(factor)
if (N >0)
factor = 1.0f
else
factor = 1.0f / factor
//end if
for (i = 0i <ni++) {
if (AmplitudeFrequences) AmplitudeFrequences[i] = output[i].getReal() * factor
if (PhaseFrequences) PhaseFrequences[i] = output[i].getImaginary() * factor
}//next i
delete [] output
delete [] input
return
}//end FFT
int __cdecl main(int argc, char * argv[])
{
fprintf(stderr, "%s usage:\n", argv[0])
fprintf(stderr, "Public Declare Sub FFT Lib \"wfft.exe\" \
(ByVal N As Long, ByRef inputReal As Double, ByRef inputImaginary As Double, \
ByRef freqAmplitude As Double, ByRef freqPhase As Double)")
return 0
}//end main
}//end extern "C"
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)