数字图像处理,3*3/5*5/7*7中值滤波程序,编译啥的都没错,一运行就显示基础类应用程序已停止工作。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数字图像处理,3*3/5*5/7*7中值滤波程序,编译啥的都没错,一运行就显示基础类应用程序已停止工作。相关的知识,希望对你有一定的参考价值。

程序如下:

部分程序:

/*****************3*3中值滤波***************/
void CDemoView::Onmid3()

// TODO: Add your command handler code here
CDemoDoc *pDoc=GetDocument();
HDIB dib=pDoc->GetHDIB();

LPSTR lpDIB = (LPSTR) ::GlobalLock((HGLOBAL) dib);
LPBITMAPINFOHEADER phead=(LPBITMAPINFOHEADER)lpDIB;
int w = phead->biWidth;
int h = phead->biHeight;
int b = phead->biBitCount/8;
if(b==3)

::GlobalUnlock(dib); //只处理灰度图像
return;


int lineByte=(w * b+3)/4*4;

unsigned char *lpDIBBits=(unsigned char *)::FindDIBBits(lpDIB);

int i, j,x,y,m;
int flag;
BYTE pixel[9],mid;
BYTE temp;

unsigned char *buf=new unsigned char[w*h*b];

for(i=1;i<h-1;i++)

for(j=1;j<w-1;j++)

m=0;
for(x=i-1;x<=i+1;x++)
for(y=j-1;y<=j+1;j++)

pixel[m]=lpDIBBits[x*lineByte+y];
m++;

do
flag=0;
for(m=0;m<8;m++)

if(pixel[m]<pixel[m+1])

temp=pixel[m];
pixel[m]=pixel[m+1];
pixel[m+1]=temp;
flag=1;


while(flag==1);

mid=pixel[4];

*(buf+i*w*b+j)=mid;



for(i=0;i<h-1;i++)
for(j=0;j<w-1;j++)
*(lpDIBBits+i*lineByte+j)=*(buf+i*w*b+j);



::GlobalUnlock(dib);

Invalidate();

参考技术A 程序有问题,好好检查。追问

已发现错误,谢谢。

本回答被提问者采纳

数字信号处理数字信号处理简介 ( 数字信号处理技术 | 傅里叶变换 )





一、数字信号处理技术



数字信号处理 ( DSP , Digital Signal Processing )信息学科计算机学科 结合产生的一门新的学科 , 核心是 使用 数值计算的方法 , 完成对信号的处理 ;

DSP 有两种理解 :

  • Digital Signal Processor : 数字信号处理器 ;
  • DSP , Digital Signal Processing : 数字信号处理技术 ;

数字信号处理完整过程 :

模拟信号 经过 A/D 转换数字信号 , 数字信号经过 数字信号处理 转换成新的 数字信号 , 然后经过 D/A 转换模拟信号 ;


Analog Signal 模拟信号 , Digital Signal 数字信号 ;

数字信号处理一般进行 频谱分析 , 滤波 , 数据压缩 , 数据调制解调 等处理 ;


DSP 实现 : 数字信号处理一般使用硬件实现 ,

  • 通用 CPU: 一般的电脑 , 服务器 上运行的 DSP 算法 ; CPU 的性能越来越高 ( 这个是主要趋势 ) ;
  • DSP 芯片 : TI 公司的 TMS320 系列芯片 , AD 公司的 ADSP 系列芯片 , AT&T 的 TS201 系列芯片 ;
  • 可编程芯片 ;
  • 专用芯片 ;

数字信号处理前置学科 :

  • 高等数学 ;
  • 信号与系统 ;
  • C语言 / Java 语言 ( 或者其它任意一门编程语言 ) ;
  • MATLAB ;




二、傅里叶变换 ( 时域转频域 )



信号的主要变换方式 : 傅里叶级数变换 , 傅里叶变换 , 拉普拉斯变换 , 等 ;

模拟信号先表示成 数字信号 , 然后再使用傅里叶变换进行 频谱分析 ,

x ( t ) ⟷ F T x ( j Ω ) x(t) \\stackrel{FT}{\\longleftrightarrow} x( j \\Omega ) x(t)FTx(jΩ)

c o s Ω 0 t cos \\Omega_0 t cosΩ0t 的频谱是一个冲激 :


c o s Ω 0 t ⟷ F T π ∣ δ ( Ω − Ω 0 ) + δ ( Ω + Ω 0 ) ∣ cos \\Omega_0 t \\stackrel{FT}{\\longleftrightarrow} \\pi | \\delta (\\Omega - \\Omega_0) + \\delta (\\Omega + \\Omega_0) | cosΩ0tFTπδ(ΩΩ0)+δ(Ω+Ω0)

c o s Ω 0 t cos \\Omega_0 t cosΩ0t 是一个能量无限的信号 , 其 所有的能量都集中在了 Ω 0 \\Omega_0 Ω0 频率上 , 因此是一个冲激 ;

傅里叶变换频谱分析反应了信号在频率意义上的能量分布 ; c o s Ω 0 t cos \\Omega_0 t cosΩ0t 在除 Ω 0 \\Omega_0 Ω0 之外的频率上 , 能量都是 0 0 0 ,


如果一个信号在时间上是可分的 , 没有噪声 , 如 在 0 0 0 ~ 100 100 100 秒内发出 5 K H z 5KHz 5KHz 信号 , 在 100 100 100 ~ 200 200 200 秒内发出 2 K H z 2KHz 2KHz 信号 , 简单的时域分析 , 就可以分析该信号的情况 , 没有必要进行傅里叶变换 ;


频谱图上表示的是一段时间内 , 不同频率上 , 信号的能量强度 ;


如果在信号上加入了噪声 , 如果 将信号从时域转为频域 , 可以很清晰的看到每个频率上的信号能量分布 , 如果噪音的频率与信号的频率不同 , 可以很清晰的看到哪些是噪音 , 哪些是信号 ; 同时可以计算出信号的信噪比 ;

在时间上 , 信号和噪声同时存在 , 都存在了 200 200 200 秒 , 经过傅里叶变换 , 检查频谱 , 可以将分布在所有时间上的不同频率的的能量分析出来 , 哪个是噪音 , 哪个是信号 , 一目了然 ;


电话的双音多频信号 , 使用两个固定频率单音信号 , 组合成一个信号 , 转为频域信号时 , 只要 监控这两个固定频率的信号强度 , 就知道是否发出了该组合信号 ;


在相同时间内 , 出现与信号频率相同的噪声 , 如收听某个广播电台的 100 H z 100Hz 100Hz 频率的广播信号时 , 突然出现干扰噪声 , 该干扰也是 100 H z 100Hz 100Hz 的 , 这样即使使用傅里叶变换 , 在频谱分析上也无法识别出噪声 ;

对于与信号的 时域 , 频域 相同的噪声 , 需要使用阵列信号处理 , 将 时域变到空域 , 在空间上 , 噪声与信号是处于不同空间的 , 这里就有一个与频谱类似的 空间谱 ,

以上是关于数字图像处理,3*3/5*5/7*7中值滤波程序,编译啥的都没错,一运行就显示基础类应用程序已停止工作。的主要内容,如果未能解决你的问题,请参考以下文章

java编写一个计算圆周率π的近似值π=4*(1-1/3+1/5-1/7+1/9-1/11+....)

如何计算100以内的所有素数?

下面的公式可以用来计算圆周率PI的近似值: PI/8=1/(1*3)+1/(5*7)+1/(9*11)+…… 请编程序计算公式的

编写程序用下面公式求π的近似值 π/4 ≈ 1- 1/3+1/5-1/7+…… 直到最后一项的绝对值小于10-7 为止

负数的输出总是-3

反素数和素数表