文档库 最新最全的文档下载
当前位置:文档库 › 快速中值滤波及c语言实现

快速中值滤波及c语言实现

快速中值滤波及c语言实现
快速中值滤波及c语言实现

快速中值滤波及c语言实现

学生姓名:刘勇学号:6100410218 专业班级:数媒101

【摘要】本文讨论了用c语言在微机上实现中值滤波及快速算法,在程序设计的过程中充分考虑到程序运行的时间复杂度和空间复杂度的问题.解决了由于图像太大而内存不够的问题,运用对程序运行时的方法,得出在PENTIUM-S100MHz上中值滤渡的一般算法运行4.23秒.而快速算法运行2 58秒。

【关键词】c语言;中值滤波;快速算法

1 引言

中值滤波是涂基发明的一种非线性信号处理技术,对抑制图像的噪声非常有效,在二维形式下,中值滤渡器是一个古有奇数个像素的滑动窗口,窗口正中的象素的灰度值用窗口内各个象素的中值代替窗口的中值为窗口中象素按大小顺序排列后处于中间位置的象素;本文讨论中值滤的一般算法并比较其运算速度。

2 用C语言实现算法的若干问题

在设计算法编制程序的时候,我们充分考虑到程序运行的时间复杂度和空间复杂度问题,在解决问

题的前提下,使算法尽量简单,使程序运行占有的空间尽量的小,这样来减少不必要的时问浪费和空间浪费,从而太大的提高程序执行的效率。

首先考虑到的内存问题。由于在本文算法中用的图像是512+512 8bit,这就存在一个内存不够大一整幅图像不能一次性调入的问题。为了解受此问题,可以只开辟一个3"512的缓冲区n,将原图像采用分批调入缓冲区,使内存不够的问题得到了圆满的解决。

另外为了对中值滤波的快速算法和普通算法进行精确的比较,采用对程序运行计时的方法,并精确计算每个算法运行的时间,使得出的结论更可靠。

3 中值滤波算法的C语言程序实现

本算法采用对开辟的3*512的缓冲区从左到右依次形成一个3*3的窗口.然后将此3*3的窗口放

人一个一维数组中,调用求中值子函数.通过排序得出中值,当此中值不等于窗口中间位置的象素时.用此中值来代替窗VI中间位置的象素灰度值.若此缓冲区处理完毕后,将缓冲区的第一行存入新建的文件中,将第二、第三行分别向上移动一行,若存人新建的文件中的行数小于或等于511(即这样处理的行

数小于或等于511),则从原文件中调入一行作为缓冲区第三行,按上述方法进行直到处理的总行数等于511为止,最后,将缓冲区的第二、三行存人新建的文件,程序流程框图如图1

4 中值滤波快速算法的C语言程序实现

本算法充分利用了上一次处理的结果.采用迭代,逐次逼近的方法得到本次的中值,在一行处理完毕后转人下一行也采用走S型的方法.这样除第一个窗口采用了一伏排序得到中值外,其它的窗口都利

用上伏的窗口的象素删除无用的3个象素后再加人新的3个象素,利用迭代的方法得到本次窗口的中值.这样太大地提高了程序执行的效率。

4.1算法的解释

首先是开辟一个3*512的缓冲区a,在初始化缓冲区时考虑到时间复杂度的问题,所以只初始化了第二、三行,而对第一行只初始化了前三个象素,这样便在缓冲区中可以得到一个3*3的窗口,对此窗口进行排序求中值后得出第一个窗口的中间象素的值.将文件指针定位在2*512处。然后开始循环,当处理的行数小于或等于511时,将缓冲区a中的第二、三行分别向上移动一行变为第一、二行,从文件中读人512个字节作为缓冲区的第三行,并用行数模2的方法设置方向标志k.当k为0时,从左向右移动窗口.当k为1时.从右向左移动窗口.而每一窗口都利用上次的窗口的像素删除无用的3个象素后再加入新的3个象素.利用迭代的方法从上次的中值得到本次的中值。当处理完一行后将缓冲区的第一行存入新建的文件中,最后将缓冲区的第二、三行存入文件中。

4.2 算法代码

// ImageProcessingDoc.cpp : implementation of the CImageProcessingDoc class

//

#include "stdafx.h"

#include "ImageProcessing.h"

#include "ImageProcessingDoc.h"

#include "GreyRatio.h"

#include

#define PI (acos(0.0) * 2)

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE

static char THIS_FILE[] = __FILE__;

#endif

///////////////////////////////////////////////////////////////////// ////////

// CImageProcessingDoc

IMPLEMENT_DYNCREATE(CImageProcessingDoc, CDocument)

BEGIN_MESSAGE_MAP(CImageProcessingDoc, CDocument)

//{{AFX_MSG_MAP(CImageProcessingDoc)

ON_COMMAND(ID_HISTOGRAM_ADJUSTIFCATION, OnHistogramAdjustifcation) ON_COMMAND(ID_FFT, OnFft)

ON_COMMAND(ID_SALT_PEPPER_NOICE, OnSaltPepperNoice)

ON_COMMAND(ID_RANDOM_NOISE, OnRandomNoise)

ON_COMMAND(ID_MEDIAN_FILTERING, OnMedianFiltering)

ON_COMMAND(ID_DCT, OnDct)

ON_COMMAND(ID_FWT, OnFwt)

ON_COMMAND(ID_DHT, OnDht)

ON_COMMAND(ID_WAVELET_TRANSFORM, OnWaveletTransform)

ON_COMMAND(ID_GREY_ADJUSTIFCATION, OnGreyAdjustifcation)

ON_COMMAND(ID_GREY_LINEAR_ADJUSTIFCATION, OnGreyLinearAdjustifcation)

ON_COMMAND(ID_GREY_SEGLINEAR_ADJUSTIFCATION, OnGreySeglinearAdjustifcation)

ON_COMMAND(ID_2DGRAD, On2dgrad)

ON_COMMAND(ID_ROBERT, OnRobert)

//}}AFX_MSG_MAP

END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////// ////////

// CImageProcessingDoc construction/destruction

CImageProcessingDoc::CImageProcessingDoc()

{

// TODO: add one-time construction code here

mImageFile = NULL;

bFileIsLoad = FALSE;

nRows = 256;

nCols = 256;

mSourceData = NULL;

pSourceData = NULL;

bDataIsProcessed = FALSE;

mResultData = FALSE;

pResultData = FALSE;

FourierDataR = NULL;

FourierDataI = NULL;

}

CImageProcessingDoc::~CImageProcessingDoc()

{

}

BOOL CImageProcessingDoc::OnNewDocument()

{

if (!CDocument::OnNewDocument())

return FALSE;

// TODO: add reinitialization code here

// (SDI documents will reuse this document)

return TRUE;

}

///////////////////////////////////////////////////////////////////// ////////

// CImageProcessingDoc serialization

voidCImageProcessingDoc::Serialize(CArchive&ar)

{

if (ar.IsStoring())

{

// TODO: add storing code here

}

else

{

// TODO: add loading code here

}

}

///////////////////////////////////////////////////////////////////// ////////

// CImageProcessingDoc diagnostics

#ifdef _DEBUG

voidCImageProcessingDoc::AssertValid() const

{

CDocument::AssertValid();

}

voidCImageProcessingDoc::Dump(CDumpContext& dc) const

{

CDocument::Dump(dc);

}

#endif //_DEBUG

///////////////////////////////////////////////////////////////////// ////////

// CImageProcessingDoc commands

BOOL CImageProcessingDoc::OnOpenDocument(LPCTSTR lpszPathName) {

int x;

int y;

if (!CDocument::OnOpenDocument(lpszPathName))

return FALSE;

// TODO: Add your specialized creation code here

if(mSourceData)

{

free(mSourceData);

mSourceData = NULL;

}

if (!(mSourceData = (unsigned char

*)malloc(nRows*nCols*sizeof(unsigned char))))

return FALSE;

if (pSourceData)

{

free(pSourceData);

pSourceData = NULL;

}

if (!(pSourceData = (unsigned char

*)malloc(3*nRows*nCols*sizeof(unsigned char))))

return FALSE;

if (mResultData)

{

free(mResultData);

mResultData = NULL;

}

if (!(mResultData = (unsigned char

*)malloc(nRows*nCols*sizeof(unsigned char))))

return FALSE;

if (pResultData)

{

free(pResultData);

pResultData = NULL;

}

if (!(pResultData = (unsigned char

*)malloc(3*nRows*nCols*sizeof(unsigned char))))

return FALSE;

if (mImageFile)

{

fclose(mImageFile);

mImageFile = NULL;

}

if (!(mImageFile = fopen(lpszPathName,"rb")))

{

free(mSourceData);

return FALSE;

}

if (fread(mSourceData,sizeof(unsigned

char),nRows*nCols,mImageFile) != (unsigned)nCols*nRows) {

free(mSourceData);

fclose(mImageFile);

mImageFile = NULL;

bFileIsLoad = false;

return FALSE;

}

for(y = 0; y

for(x = 0; x

{

pSourceData[3*y*nCols+3*x] = mSourceData[y*nCols+x]; pSourceData[3*y*nCols+3*x+1] = mSourceData[y*nCols+x]; pSourceData[3*y*nCols+3*x+2] = mSourceData[y*nCols+x];

}

bFileIsLoad = TRUE;

return TRUE;

}

voidCImageProcessingDoc::OnHistogramAdjustifcation()

{

// TODO: Add your command handler code here

intx,y;

double *mR;

double *mS;

mR = new double[256];

mS = new double[256];

for(x=0;x<256;x++)

{

mR[x] = mS[x] = 0.0;

}

//统计直方图

for(y = 0; y

for(x = 0; x

{

mR[mSourceData[y*nCols+x]] ++;

}

for(x=0;x<256;x++)

{

for(y=0;y

mS[x] += mR[y];

mS[x] /= nRows*nCols;

}

//直方图变换

for(y = 0; y

for(x = 0; x

mResultData[y*nRows+x] = (char) (255* mS[mSourceData[y*nRows+x]]);

//灰度计算

for(y = 0; y

for(x = 0; x

{

pResultData[3*y*nCols+3*x] = mResultData[y*nCols+x]; pResultData[3*y*nCols+3*x+1] = mResultData[y*nCols+x]; pResultData[3*y*nCols+3*x+2] = mResultData[y*nCols+x];

}

//更新显示

UpdateAllViews(NULL);

}

// FFTandIFFT 一维傅立叶变换与你变换函数

// 输入时域数据实部Tr,虚部Ti

// 输出频域数据实部Tr,虚部Ti

// 序列长度N,N等于2的r次幂

// FFTorIFFT,逻辑变量,非零做正变换,零做反变换voidCImageProcessingDoc::FFTandIFFT(float *Tr, float *Ti, int N, boolFFTorIFFT)

{

int r; //迭代次数

intl,j,k;//循环变量

int p; //用于蝶形计算加权系数的指数

int B; //对偶结点距离

float X,Y,XX,YY;

float w;

float cosw,sinw;

if (!FFTorIFFT)

{ //如果做傅立叶你变换,则必须对数列除以N for(l=0;l

{

Tr[l] /= N;

Ti[l] /= N;

}

}

//计算循环次数r

r = 0; l = N;

while(l /= 2) r++;

//倒序

int LH = N/2;

inti;

float temp;

j = 0;

for (i=1;i

{

k = LH;

while(j>=k)

{

j = j-k;

k = k/2;

}

j = j + k;

if (i<=j)

{

temp = Tr[i]; Tr[i] = Tr[j]; Tr[j] = temp;

temp = Ti[i]; Ti[i] = Ti[j]; Ti[j] = temp;

}

}

for(l=0; l <= r; l++) //共r级

{

B = 1<<(l-1); // 第l层对偶结点距离为2^(l-1)

for(j=0; j

{

p = j*(1<<(r-l));

w = 2*PI*p/N;

for(k=j;k

{

if (FFTorIFFT)

{ //若做傅立叶正变换

cosw =cos(-w);

sinw =sin(-w);

}

else

{ //傅立叶反变换

cosw =cos(w);

sinw =sin(w);

}

X = Tr[k] + Tr[k+B]*cosw - Ti[k+B] * sinw;

Y = Ti[k] +Tr[k+B]*sinw + Ti[k+B] * cosw; XX = Tr[k] - Tr[k+B]*cosw + Ti[k+B] * sinw;

YY = Ti[k] - Tr[k+B]*sinw - Ti[k+B] * cosw;

Tr[k] = X;

Ti[k] = Y;

Tr[k+B] = XX;

Ti[k+B] = YY;

}

}

}

}

voidCImageProcessingDoc::OnFft()

{

// TODO: Add your command handler code here

inti,j;

intii,jj;

float temp;

float *Tr;

float *Ti;

Tr = new float[nCols];

Ti = new float[nCols];

if ( FourierDataR)

{

deleteFourierDataR;

FourierDataR = NULL;

}

if ( FourierDataI)

{

deleteFourierDataI;

FourierDataR = NULL;

}

FourierDataR = new float[nRows*nCols];

FourierDataI = new float[nRows*nCols];

for(i=0;i

for(j=0;j

{ //图像数据先给傅立叶变换数组

FourierDataR[i*nCols+j] = (float) mSourceData[i*nCols+j];

FourierDataI[i*nCols+j] = 0.0;

}

for (i=0;i

{ //每行进行傅立叶变换

for (j=0;j

{

Tr[j] = FourierDataR[i*nCols + j];

Ti[j] = FourierDataI[i*nCols + j];

}

FFTandIFFT(Tr,Ti,nCols,1);

for (j=0;j

{

FourierDataR[i*nCols + j] = Tr[j];

FourierDataI[i*nCols + j] = Ti[j];

}

}

deleteTr;

delete Ti;

Tr = new float[nRows];

Ti = new float[nRows];

for(j=0;j

{ //每列进行傅立叶变换

for (i=0;i

{

Tr[i] = FourierDataR[i*nCols + j];

Ti[i] = FourierDataI[i*nCols + j];

}

FFTandIFFT(Tr,Ti,nRows,1);

for (i=0;i

{

FourierDataR[i*nCols + j] = Tr[i];

FourierDataI[i*nCols + j] = Ti[i];

}

}

for (i=0;i

for (j=0;j

{

temp = sqrt(FourierDataR [i*nCols+j]*FourierDataR [i*nCols+j] +FourierDataI [i*nCols+j]*FourierDataI[i*nCols+j] );

temp /= 100;

if(temp > 255.0)

temp = 255.0;

ii = nRows - 1 - (i

jj = (j

//将变换后现实的原点调整在中心位置

pResultData[3*ii*nCols+3*jj] = (int) temp;

pResultData[3*ii*nCols+3*jj+1] = (int) temp;

pResultData[3*ii*nCols+3*jj+2] = (int) temp;

}

//更新显示

UpdateAllViews(NULL);

deleteFourierDataR;

deleteFourierDataI;

FourierDataI = NULL;

FourierDataR = NULL;

return;

}

voidCImageProcessingDoc::OnSaltPepperNoice()

{

// TODO: Add your command handler code here // TODO: Add your command handler code here int x;

int y;

Salt_Pepper_Noise(mSourceData,nCols,nRows);

for(y = 0; y

for(x = 0; x

{

pSourceData[3*y*nCols+3*x] = (unsigned char) mSourceData[y*nCols+x];

pSourceData[3*y*nCols+3*x+1] = (unsigned char) mSourceData[y*nCols+x];

pSourceData[3*y*nCols+3*x+2] = (unsigned char) mSourceData[y*nCols+x];

}

UpdateAllViews(NULL);

}

voidCImageProcessingDoc::OnRandomNoise()

{

// TODO: Add your command handler code here

int x;

int y;

Random_Noise(mSourceData,nRows,nCols);

for(y = 0; y

for(x = 0; x

{

pSourceData[3*y*nCols+3*x] = (unsigned char) mSourceData[y*nCols+x];

pSourceData[3*y*nCols+3*x+1] = (unsigned char) mSourceData[y*nCols+x];

pSourceData[3*y*nCols+3*x+2] = (unsigned char) mSourceData[y*nCols+x];

}

UpdateAllViews(NULL);

}

voidCImageProcessingDoc::Salt_Pepper_Noise(unsigned char *mdata, intnHeight, intnWidth)

{

unsigned char* lpSrc;

//循环变量

longi;

long j;

//生成伪随机种子

srand((unsigned)time(NULL));

//在图像中加噪

for (j = 0;j

{

for(i = 0;i

{

if(rand()>31500)

{

// 指向源图像倒数第j行,第i个象素的指针

lpSrc = (unsigned char *)&mdata[j*nWidth + i];

//图像中当前点置为黑

*lpSrc = 0;

}

}

}

// 返回

return ;

}

voidCImageProcessingDoc::Random_Noise(unsigned char *mdata, intnHeight, intnWidth)

{

// 指向源图像的指针

unsigned char* lpSrc;

//循环变量

longi;

long j;

//像素值

unsigned char pixel;

//噪声

BYTE NoisePoint;

//生成伪随机种子

srand((unsigned)time(NULL));

//在图像中加噪

for (j = 0;j

{

for(i = 0;i

{

NoisePoint=rand()/1024;

// 指向源图像倒数第j行,第i个象素的指针

lpSrc = (unsigned char *)&mdata[nWidth * j + i];

//取得像素值

pixel = (unsigned char)*lpSrc;

*lpSrc = (unsigned char)(pixel*224/256 + NoisePoint);

}

}// 返回

return ;

}

voidCImageProcessingDoc::MedianFiltering(unsigned char *sourcedata, unsigned char *resultdata,intnHeight, intnWidth, intnR)

{

inti,j,m,n,r;

unsignedtmp;

unsigned char* mdata = new unsigned char[(2*nR+1)*(2*nR+1)];

for (i=0;i

for (j=0;j

{

if((inHeight-nR-1) || (jnWidth-nR-1)) resultdata[i*nWidth+j] = 0;

else

{

for(m=-nR;m<=nR;m++)

for(n=-nR;n<=nR;n++)

mdata[(m+nR)*(2*nR+1)+n+nR]

=sourcedata[(i+m)*nWidth+(j+n)];

//排序

for(m=0;m<(2*nR+1)*(2*nR+1)-2;m++)

{

r = 1;

for (n=m+1;n<(2*nR+1)*(2*nR+1);n++)

{

if (mdata[n]

{

tmp = mdata[n];mdata[n]=mdata[n+1];mdata[n+1] =tmp;r=0;

}

}

if (r)

break;

}

mResultData[i*nWidth+j] = mdata[nR*(2*nR+1)+nR];

}

}

}

voidCImageProcessingDoc::OnMedianFiltering()

{

// TODO: Add your command handler code here

int x;

int y;

MedianFiltering(mSourceData,mResultData,nRows,nCols,1);

for(y = 0; y

for(x = 0; x

{

pResultData[3*y*nCols+3*x] = (unsigned char) mResultData[y*nCols+x];

pResultData[3*y*nCols+3*x+1] = (unsigned char) mResultData[y*nCols+x];

pResultData[3*y*nCols+3*x+2] = (unsigned char) mResultData[y*nCols+x];

}

UpdateAllViews(NULL);

}

voidCImageProcessingDoc::OnDct()

{

// TODO: Add your command handler code here

}

voidCImageProcessingDoc::OnFwt()

{

// TODO: Add your command handler code here

}

voidCImageProcessingDoc::OnDht()

{

// TODO: Add your command handler code here

}

voidCImageProcessingDoc::OnWaveletTransform()

{

// TODO: Add your command handler code here

}

voidCImageProcessingDoc::OnGreyAdjustifcation()

{

// TODO: Add your command handler code here

}

voidCImageProcessingDoc::OnGreyLinearAdjustifcation()

{

// TODO: Add your command handler code here

int x;

int y;

inttmp;

CGreyRatiomdlg;

mdlg.DoModal();

for(y=0;y

for(x=0;x

{

tmp =(int)(mdlg.m_GreyRatio*mSourceData[y*nCols+x]);

tmp = tmp>255?255:tmp;

pResultData[3*y*nCols+3*x] = tmp;

pResultData[3*y*nCols+3*x+1] = tmp;

pResultData[3*y*nCols+3*x+2] = tmp;

}

UpdateAllViews(NULL);

}

voidCImageProcessingDoc::OnGreySeglinearAdjustifcation() {

// TODO: Add your command handler code here

}

voidCImageProcessingDoc::On2dgrad()

{

// TODO: Add your command handler code here

int x;

int y;

int dx;

intdy;

inttmp;

for(y=0;y

for(x=0;x

{

dx = mSourceData[y*nCols+x] - mSourceData[y*nCols+x+1];

dy = mSourceData[y*nCols+x] - mSourceData[(y+1)*nCols+x];

tmp = (int) sqrt(dx*dx+dy*dy);

tmp = tmp>255?255:tmp;

pResultData[3*y*nCols+3*x] = tmp;

pResultData[3*y*nCols+3*x+1] = tmp;

pResultData[3*y*nCols+3*x+2] = tmp;

}

UpdateAllViews(NULL);

}

voidCImageProcessingDoc::OnRobert()

{

// TODO: Add your command handler code here

int x;

int y;

int dx;

intdy;

inttmp;

for(y=0;y

for(x=0;x

{

dx = mSourceData[y*nCols+x] - mSourceData[(y+1)*nCols+x+1];

dy = mSourceData[y*nCols+x+1] - mSourceData[(y+1)*nCols+x];

tmp = (int) sqrt(dx*dx+dy*dy);

tmp = tmp>255?255:tmp;

pResultData[3*y*nCols+3*x] = tmp;

pResultData[3*y*nCols+3*x+1] = tmp;

pResultData[3*y*nCols+3*x+2] = tmp;

}

UpdateAllViews(NULL);

}

voidCImageProcessingDoc::DCTandIDCT(float *Ff, int N, boolbDctIDct) {

float *mR;

float *mI;

inti;

float Ff0 = 0;

mR = new float[N*2];

mI = new float[N*2];

if(bDctIDct)

{

for(i=0;i<2*N;i++)

{

if(i

mR[i] = Ff[i];

else

mR[i] = 0;

mI[i] = 0;

}

for(i=0;i

Ff0 += Ff[i];

Ff0 = Ff0/sqrt(N);

FFTandIFFT(mR,mI,2*N,true);

Ff[0] = Ff0;

for(i=0;i

Ff[i] = (mR[i]*cos(i*PI/(2*N)) + mI[i]*sin(i*PI/(2*N))) *sqrt(2.0/N);

}

else

{

for(i=0;i<2*N;i++)

{

if(i

{

mR[i] = Ff[i]*cos(i*PI/(2*N));

mI[i] = Ff[i]*sin(i*PI/(2*N));

}

else

{

mR[i] = 0;

mI[i] = 0;

}

}

for(i=0;i

Ff0 += Ff[i];

Ff0 = Ff0/sqrt(N);

FFTandIFFT(mR,mI,2*N,false);

for(i=0;i

Ff[i] = 1/sqrt(N) - sqrt(2.0/N) + sqrt(2.0/N)*mR[i];

}

return;

}

结果截图;

5 结论

本文充分考虑到程序运行的时间复杂度和空间复杂度问题。解决了图象大而内存不足的问题。对中

值滤波的普通算法采用一般的常规算法,而对其快速算法采用走S型并且迭代的方法。采用对程序运行

计时的方法.对中值滤波的快速算法和普通算法进行精确的比较,结论可靠。【参考文献】

[1]王积分,张新荣.计算机图象识别IM].北京:中国铁道出版社.1988

[2]徐金梧,杨德斌.徐科.Turbo C 实用大全[M].北京:机械工业出版社,1997

中值滤波与均值滤波

四川大学电气信息学院微机原理与接口技术 实验报告 实验名称:中值滤波与均值滤波 实验地点:二基楼A514 年级: 2014级 姓名:宋雅婕 学号: 2014141443030 实验时间:2016年5月27日

一、实验内容 1.在数据段设变量数组TADA1和TADA2,并存入假设的两组采样值作为某一 采样周期的采样值。 ⒉设计中值滤波程序求出测量值。 ⒊设计均值滤波程序求出测量值。 ⒋每个程序应能将结果显示在屏幕上。 ⒌在计算机上调试程序,并获得正确结果。 二、程序框图 1. 2.中值滤波:

三、程序清单 1、中值滤波: DATAS SEGMENT TADA1 DB 65,72,33,84,43 N EQU $-TADA1 DATAS ENDS CODES SEGMENT ASSUME CS:CODES,DS:DATAS START: MOV AX,DATAS MOV DS,AX ;给DS段赋值 MOV CX,N-1 ;设置N-1轮比较次数 MOV DX,1 ;设置比较的轮次 AG: CALL MP ;调用子程序 INC DX LOOP AG MOV SI,0 XOR AX,AX ;将AX清零 MOV AL,TADA1[SI+(N-1)/2] ;取出中值 MOV BL,10 DIV BL PUSH AX ADD AL,30H MOV DL,AL MOV AH,2 INT 21H ;输出十进制数的高位POP AX ADD AH,30H MOV DL,AH MOV AH,2 INT 21H ;输出十进制数的低位 MOV AH,4CH INT 21H MP PROC ;冒泡法(从小到大排列) PUSH CX MOV CX,N SUB CX,DX MOV SI,0 RECMP: MOV AL,TADA1[SI]

数字图像处理_旋转与幅度谱(含MATLAB代码)

数字图像处理实验一 15生医 一、实验内容 产生右图所示图像 f1(m,n),其中图像大小为256 ×256,中间亮条为128×32,暗处=0,亮处=100。 对其进行FFT: ①同屏显示原图f1(m,n)和FFT(f1)的幅度谱图; ②若令f2(m,n)=(-1)^(m+n)f1(m,n),重复 以上过程,比较二者幅度谱的异同,简述理由; ③若将f2(m,n)顺时针旋转90度得到f3(m,n),试显示FFT(f3)的 幅度谱,并与FFT(f2)的幅度谱进行比较; ④若将f1(m,n) 顺时针旋转90度得到f4(m,n),令f5(m,n) = f1(m,n) + f4(m,n),试显示FFT(f5)的幅度谱,指出其与 FFT(f1)和FFT(f4)的关系; ⑤若令f6(m,n)=f2(m,n)+f3(m,n),试显示FFT(f6)的幅度谱,并指出其与 FFT(f2)和FFT(f3)的关系,比较FFT(f6)和FFT(f5)的幅度谱。 二、运行环境 MATLAB R2014a 三、运行结果及分析 1.同屏显示原图f1(m,n)和FFT(f1)的幅度谱图:

50100150200250 100150200250 50100150200250 100150200250 2.令f2(m,n)=(-1)^(m+n )f1(m,n),对其进行FFT ,比较f2与f1幅度谱的异同,简述理由: 50100150200250 100150200250 50100150200250 100150200250 异同及理由:①空域:f2由于前边乘了系数(-1)^(m+n ),导致灰度值有正有负,而在MATLAB 的imshow 函数中默认把负值变为0(有些情况是取反),所以形成了如左图所示的黑白花纹。②频域:FFT(2)

编译原理C语言词法分析器

编译原理 C语言词法分析器 一、实验题目 编制并调试C词法分析程序。 a.txt源代码: ?main() { int sum=0 ,it=1;/* Variable declaration*/ if (sum==1) it++; else it=it+2; }? 设计其词法分析程序,能识别出所有的关键字、标识符、常数、运算符(包括复合运算符,如++)、界符;能过滤掉源程序中的注释、空格、制表符、换行符;并且能够对一些词法规则的错误进行必要的处理,如:标识符只能由字母、数字与下划线组成,且第一个字符必须为字母或下划线。实验要求:要给出所分析语言的词法说明,相应的状态转换图,单词的种别编码方案,词法分析程序的主要算法思想等。 二、实验目的 1、理解词法分析在编译程序中的作用; 2、掌握词法分析程序的实现方法与技术; 3、加深对有穷自动机模型的理解。 三、主要函数 四、设计 1、主函数void main ( ) 2 3

4、整数类型判断函数 char *key1[]={" ","(",")","[","]","{","}",",",";","'"}; /*分隔符表*/

char *key2[]={" ","+","-","*","/","%","<",">","==",">=","<=","!=","!","&&","||","<<",">>","~","|","^","&","=","?:","->","++","--","、","+=","-=","*=","/="}; /*运算符表*/ int xx0[35],xx1[10],xx2[31]; int temp_key3=0,temp_c40=0,temp_c41=0,temp_c42=0,temp_c43=0; /******* 初始化函数*******/ void load() { int mm; for (mm=0;mm<=34;mm++) { xx0[mm]=0; } for (mm=0;mm<=9;mm++) { xx1[mm]=0; } for (mm=0;mm<=30;mm++) { xx2[mm]=0; } FILE *floading; if ((floading=fopen("key0、txt","w"))==NULL) { printf("Error! Can't create file : key0、txt"); return; } fclose (floading); /*建立保留字表文件:key0、txt*/ if ((floading=fopen("key1、txt","w"))==NULL) { printf("Error! Can't create file : key1、txt"); return; } /*建立分隔符表文件:key1、txt*/ if ((floading=fopen("key2、txt","w"))==NULL) { printf("Error! Can't create file : key2、txt"); return; } fclose(floading); /*建立运算符表文件:key2、txt*/ if ((floading=fopen("key3、txt","w"))==NULL) { printf("Error! Can't create file : key3、txt");

中值滤波和均值滤波代码

%均值滤波 clc,clear; f=imread('2.bmp'); subplot(221),imshow(f); f1=imnoise(f,'gaussian',0.002,0.0008); subplot(222),imshow(f1); k1=floor(3/2)+1; k2=floor(3/2)+1; X=f1; [M,N]=size(X); uint8 Y=zeros(M,N); funBox=zeros(3,3); for i=1:M-3 for j=1:N-3 funBox=X(i:i+3,j:j+3); s=sum(funBox(:)); h=s/9; Y(i+k1,j+k2)=h; end; end; Y=Y/255; subplot(223),imshow(Y); 注意:在matlab中,我们常使用imshow()函数来显示图像,而此时的图像矩阵可能经过了某种运算。在matlab中,为了保证精度,经过了运算的图像矩阵I其数据类型会从unit8型变成double型。如果直接运行imshow(I),我们会发现显示的是一个白色的图像。这是因为imshow()显示图像时对double型是认为在0~1范围内,即大于1时都是显示为白色,而imshow显示uint8型时是0~255范围。而经过运算的范围在0-255之间的double型数据就被不正常得显示为白色图像了。 那么如何解决这个问题呢?笔者曾经用fix()函数把图像矩阵由实数形式转化成整数形式,但这样仍无法改变图像矩阵是double型的事实。 通过搜索,找到两个解决方法: imshow(I/256); ----------将图像矩阵转化到0-1之间 imshow(I,[]); -----------自动调整数据的范围以便于显示(不明白原理!) PS:imshow(I,[]),将I的最小值看作0,最大值看作255,所以黑白明显

用MATLAB编程实现数字图像旋转

用MATLAB编程实现数字图像旋转 摘要:文章论述了用Matlab编程实现数字图像旋转的基本方法,从计算机几何坐标中的图像旋转矩阵表示着手,给出了图像旋转变换的推导过程,用简单综合插值方法,基本解决了数字图像旋转后出现的空洞问题,并通过Matlab编程工具进行实验验证。 关键词:数字图像旋转;移动变换;旋转矩阵变换;简单综合插值。 数字图像处理是指将图像信号转换成数字信号并利用计算机对其进行处理的过程。目前,数字图像处理的信息大多是二维信息。由于数据量大,因此对计算机的计算速度、存储容量等要求较高。随着微型计算机性能的提高,原来以大型机、小型机为主机的图像处理系统演变为以微机为主机的结构,其应用也迅速普及,当前图像处理技术在工业自动化、工业检测、遥感探测、军事、航空、生物医学等各个方面都发挥着十分重要的作用。 图像旋转是一种常用的数字图像处理技术,传统的图像旋转都是在二维空间中进行的,由于旋转后图像像素点坐标不再是整数,故旋转后必须对像素点灰度进行一维插值运算或二维插值运算,尤其是当对旋转后的图像质量要求较高时,需要采用高阶插值运算。 文章从通用的图像旋转矩阵着手,给出了图像旋转变及换简单综合插值的推导过程,并用Matlab编程工具进行实验验证图像旋转结果。 1Matlab简介 MATLAB是矩阵实验室(Matrix Laboratory)之意。除具备卓越的数值计算能力外,它还提供了专业水平的符号计算,可视化建模仿真和实时控制等功能。MATLAB的基本数据单位是矩阵,它的指令表达式与数学,工程中常用的形式十分相似,故用MATLAB来解算问题要比用C、C#等语言来解算相同的事情简捷得多。 2图像旋转矩阵

MATLAB课程设计(自适应中值滤波)

信息工程系课程设计报告 课程MATLAB课程设计 专业通信工程 班级 2级本科二班 学生姓名1 景学号114 学生姓名2 学号1414 学生姓名3 王学号6 学生姓名4 学号31 学生姓名4 学号02 二〇一四年十二月

目录 目录 (1) 摘要: (2) 关键词: (2) 1.算法描述 (2) 1.1 噪声点 (3) 1.2 窗口尺寸选择 (3) 1.3求滤波窗口内中值,并替换像素点。 (3) 2程序实现 (4) 2.1准备和描述 (4) 2.2扩大窗口、确定窗口 (5) 2.3 确定最大、最小值和中值 (6) 2.4中值替换像素点、输出图像 (7) 实验结果 (9) 参考文献 (9)

摘要:通过本次课程设计,主要训练和培养学生综合应用所学MATLAB课程的自适应中值的相关知识,独立学习自适应中值滤波的原理及处理方式。学会扩大窗口并找到其区域内的中值、最小值、以及最大值,然后用中值代替像素点。通过自主学习和查阅资料来了解程序的编写及改进,并用MATLAB进行仿真。 关键词:自适应中值滤波灰度值椒盐噪声像素点.

1.算法描述 1.1 噪声点 脉冲噪声是图像处理中常见的一类,中值滤波器对消除脉冲噪声非常有效。噪声脉冲可以是正的(盐点),也可以是负的(胡椒点),所以也称这种噪声为“椒盐噪声”。椒盐噪声一般总表现为图像局部区域的最大值或最小值,并且受污染像素的位置是随机分布的,正负噪声点出现的概率通常相等。图像噪声点往往对应于局部区域的极值。 1.2窗口尺寸选择 滤波窗口尺寸的选择影响滤波效果,大尺寸窗口滤波能力强,但细节保持能力较弱;小尺寸窗口能保持图像大量细节但其滤波性能较低。根据噪声密度的大小自适应地选择滤波窗口可以缓和滤波性能与细节保持之间的矛盾,同时也增加了算法的时间复杂度。从形状看来窗口方向要沿着边缘和细节的方向,不能穿过它们也不能把它们和周围相差很大的像素包含在同一窗口中否则边缘和细节会被周围像素模糊。 1.3求滤波窗口内中值,并替换像素点。 设f ij为点(i,j)的灰度,A i,j为当前工作窗口,f min、f max 和f med分别为A i,j中的灰度最小值、灰度最大值和灰度中值, A

c语言语法分析器详解

#include #include #include /*******************************************/ int count=0; /*分解的产生式的个数*/ int number; /*所有终结符和非终结符的总数*/ char start; /*开始符号*/ char termin[50]; /*终结符号*/ char non_ter[50]; /*非终结符号*/ char v[50]; /*所有符号*/ char left[50]; /*左部*/ char right[50][50]; /*右部*/ char first[50][50],follow[50][50]; /*各产生式右部的FIRST和左部的FOLLOW集合*/ char first1[50][50]; /*所有单个符号的FIRST集合*/ char select[50][50]; /*各单个产生式的SELECT集合*/ char f[50],F[50]; /*记录各符号的FIRST和FOLLOW是否已求过*/ char empty[20]; /*记录可直接推出@的符号*/ char TEMP[50]; /*求FOLLOW时存放某一符号串的FIRST集合*/ int validity=1; /*表示输入文法是否有效*/ int ll=1; /*表示输入文法是否为LL(1)文法*/ int M[20][20]; /*分析表*/ char choose; /*用户输入时使用*/ char empt[20]; /*求_emp()时使用*/ char fo[20]; /*求FOLLOW集合时使用*/ /******************************************* 判断一个字符是否在指定字符串中 ********************************************/ int in(char c,char *p) { int i; if(strlen(p)==0) return(0); for(i=0;;i++) { if(p[i]==c) return(1); /*若在,返回1*/ if(i==strlen(p)) return(0); /*若不在,返回0*/ } } /******************************************* 得到一个不是非终结符的符号 ********************************************/

数字图像处理实验三中值滤波和均值滤波实验报告材料

数字图像处理实验三 均值滤波、中值滤波的计算机实现12281166 崔雪莹计科1202班 一、实验目的: 1)熟悉均值滤波、中值滤波处理的理论基础; 2)掌握均值滤波、中值滤波的计算机实现方法; 3)学习VC++ 6。0 的编程方法; 4)验证均值滤波、中值滤波处理理论; 5)观察均值滤波、中值滤波处理的结果。 二、实验的软、硬件平台: 硬件:微型图像处理系统,包括:主机, PC机;摄像机; 软件:操作系统:WINDOWS2000或WINDOWSXP应用软件:VC++ 6.0 三、实验内容: 1)握高级语言编程技术; 2)编制均值滤波、中值滤波处理程序的方法; 3)编译并生成可执行文件; 4)考察处理结果。 四、实验要求: 1)学习VC++确6。0 编程的步骤及流程; 2)编写均值滤波、中值滤波的程序;

3)编译并改错; 4)把该程序嵌入试验二给出的界面中(作适当修改); 5)提交程序及文档; 6)写出本次实验的体会。 五、实验结果截图 实验均值滤波采用的是3X3的方块,取周围的像素点取得其均值代替原像素点。边缘像素的处理方法是复制边缘的像素点,增加一个边框,计算里面的像素值得均值滤波。

六、实验体会 本次实验在前一次的实验基础上增加均值滤波和中值滤波,对于椒盐噪声的处理,发现中值滤波的效果更为好一点,而均值滤波是的整个图像变得模糊了一点,效果差异较大。本次实验更加增加了对数字图像处理的了解与学习。 七、实验程序代码注释及分析 // HistDemoADlg.h : 头文件 // #include "ImageWnd.h" #pragma once // CHistDemoADlg 对话框 class CHistDemoADlg : public CDialogEx { // 构造

真正实现C语言绘制数学函数图像

用C语言画函数图像 横纵坐标单位长度比校正(3:5) 真正的余弦函数 #include #include int sishewuru(float a); void main() { int n = 450; float a[500], b[500]; int i,j; a[0] = b[0] = 0; for (i = 1; i < n; i++)

a[i] = a[i - 1] + 0.01; b[i] = cos(a[i]); } int A[500],B[500]; for (i = 0; i < n; i++) { //printf("sin(%f)=%f\n", a[i], b[i]); a[i] = 100 * a[i]; b[i] = 55 * b[i]; A[i] = sishewuru(a[i]); B[i] = sishewuru(b[i])+60; //printf("sin(%d)=%d\n", A[i], B[i]); } for ( i = 100; i >=0; i--) { for ( j = 0; j < n; j++) { if (i==B[j]) { printf("*"); } else { printf(" "); } } printf("\n"); } } int sishewuru(float a) { int m; if (a-floor(a)<0.5) { m = a; return m; } else { m = a + 1; return m; } }

1.调节输出框大小,字符显示大小 2.确定函数的定义域 3.确定定义域上的步长 4.计算函数值 5.确定函数值放大系数 6.确定定义域恰好落在显示的区间内 7.确定坐标的单位长度与字符实际长度之间的换算关系 8.确定打点的顺序与坐标的关系 定义域在),(ππ-的正弦函数图像 定义域在),(ππ-的正切函数图像

c语言字符串左旋转

假设原数组序列为abcd1234,要求变换成的数组序列为1234abcd,即循环右移了4 位。 比较之后,不难看出,其中有两段的顺序是不变的:1234 和abcd,可把这两段看成两个整 体。右移K 位的过程就是把数组的两部分交换一下。 变换的过程通过以下步骤完成: 逆序排列abcd:abcd1234 →dcba1234; 逆序排列1234:dcba1234 →dcba4321; 全部逆序:dcba4321 →1234abcd。 伪代码可以参考清单2-35。 //代码清单2-35 Reverse(int* arr, int b, int e) { for(; b < e; b++, e--) { int temp = arr[e]; arr[e] = arr[b]; arr[b] = temp; } } RightShift(int* arr, int N, int k) {

K %= N; Reverse(arr, 0, N – K - 1); Reverse(arr, N - K, N - 1); 8 Reverse(arr, 0, N - 1); } 这样,我们就可以在线性时间内实现右移操作了。 就拿abcdef 这个例子来说(非常简短的三句,请细看,一看就懂): 1、首先分为俩部分,X:abc,Y:def; 2、X->X^T,abc->cba,Y->Y^T,def->fed。 3、(X^TY^T)^T=YX,cbafed->defabc,即整个翻转。 #include 5. #include 6. 7. void rotate(char *start, char *end) 8. { 9. while(start != NULL && end !=NULL && start

C语言编译器的设计与实现.

C语言编译器的设计与实现 01计算机4班18号任春妍2号陈俊我们设计的编译程序涉及到编译五个阶段中的三个,即词法分析器、语法分析器和中间代码生成器。编译程序的输出结果包括词法分析后的二元式序列、变量名表、状态栈分析过程显示及四元式序列程序,整个编译程序分为三部分: (1) 词法分析部分 (2) 语法分析处理及四元式生成部分 (3) 输出显示部分 一.词法分析器设计 由于我们规定的程序语句中涉及单词较少,故在词法分析阶段忽略了单词输入错误的检查,而将编译程序的重点放在中间代码生成阶段。词法分析器的功能是输入源程序,输出单词符号。我们规定输出的单词符号格式为如下的二元式:(单词种别,单词自身的值) #define ACC -2 #define syl_if 0 #define syl_else 1 #define syl_while 2 #define syl_begin 3 #define syl_end 4 #define a 5 #define semicolon 6 #define e 7 #define jinghao 8 #define s 9 #define L 10 #define tempsy 11 #define EA 12 #define EO 13 #define plus 14 #define times 15 #define becomes 16 #define op_and 17 #define op_or 18 #define op_not 19 #define rop 20 #define lparent 21 #define rparent 22 #define ident 23 #define intconst 24

几种中值滤波去噪方法分析

几种中值滤波去噪方法分析 在数字图像的转换、存储和传输等过程中,经常性由于电子设备工作环境的不稳定,由于设备中含有一些污染物等原因,导致数字图像中一些像素点的灰度值发生非常大的变化,变得非常小或者非常大;而且大气环境很容易干扰无线数据传输,从而让传输信号混入噪声,接收到的无线信号恢复成传输过来的数字图像较原图像相比也会有很大的不同。在这些过程中,椒盐噪声很容易就会对数字图像造成感染。客户满意的数字图像尽可能少或者没有受到椒盐噪声的污染。所以我们需要去噪处理。 在现阶段处理椒盐噪声方面的研究成果方面,因为中值滤波有其非线性的特性,对比其他线性滤波方法可以取得更好的效果,同切同时还可以更好的保留图像的边缘信息。很多学者在研究通过中值滤波消除椒盐噪声的影响,希望可以得到更好的去噪效果。 第一节标准中值滤波方法 标准中值滤波是把这个窗口内的像素点按灰度值大小进行排列,把灰度值的平均值当作标准值。 我们以一个8位的图像作为例子,因为椒盐噪声会让受影响的像素点灰度值改为亮点,即灰度值为255;或者暗点,即灰度值为0。我们在排序的时候,把收到污染的像素点的灰度值大小排列出来,取中间值为所有噪点值,那么就可以消除噪声污染对这个点的影响。其具体步骤如下: ①把窗口在图像中滑动,然后让窗口中心与某一像素点重合 ②记录下窗口中所有像素点的灰度值 ③将这些灰度值从小到大排序 ④记录下该灰度值序列中间的值 ⑤将所记录下的中间值替代窗口中心像素点的灰度值 因为中值滤波的输出灰度值大小是由窗口的中值大小所决定的,所以中值滤

波对于窗口内脉冲噪声远远没有均值滤波敏感。因此相对于均值滤波,中值滤波可以在有效去除脉冲噪声的同时,减小更多的模糊图像。由于由于中值滤波所采用的窗口大小会直接决定去噪效果和图像模糊程度,而且图像去噪后的用途也就决定了窗口的形式。以5*5窗口为例,常见的形状如图2.1所示: 图 2.1 常见的尺寸为5*5的中值滤波窗口 尽管标准中值滤波方法称得上是现在市面上的一种最简单有效的去除椒盐噪声的方法。但是它判断像素点是否被噪声影响的机制不明确,尽管采用该方法时已经对所有像素点进行了一次滤波操作,还是会在一定程序上对图像的边缘、细节信息产生破坏。 第二节带权值的中值滤波方法 Brownrigg提出了一种改进的中值滤波方法:带权值的中值滤波方法。这个滤波的步骤和SM基本一样,不同的地方在于:WM在排序取中值的时候要在

数字图像处理9-图像的平移与旋转

这次作业的内容是要完成让图片绕任意一点旋转的效果,同时要了解图像旋转的原理。为了达到这一目的,我在老师的示例代码上进行了改进,并自己计算出新的变换矩阵,达到了作业中要求的效果。这里我们先来看一下旋转的效果。 旋转中心(0,0),旋转60°旋转中心(0,0),旋转120° 旋转中心(100,0),旋转120°旋转中心(0,600),旋转120° 图像的大小是690*728,旋转的角度为顺时针,因此可以看到四副图中的结果都是符合预期的。之后我们来通过代码,详细的分析这一变化实现的过程。代码如下: close all; f = imread('try.jpg'); theta = 2* pi / 3; x0=0; y0=600; T = [cos(theta) sin(theta) 0 -sin(theta) cos(theta) 0 0 0 1]; t1=[ 1 0 0

0 1 0 -x0 -y0 1]; t2=[1 0 0 0 1 0 x0 y0 1]; T=t1*T*t2; tform = maketform('affine',T); [g, xdata, ydata] = imtransform(f,tform, 'FillValue',255); imshow(g,'XData',xdata,'YData',ydata); hold on; imshow(f); axis auto; axis on; 读入图像后,先设定了三个参数,x0y0就是旋转中心的坐标,而theta就是旋转角(顺时针)。这里要详细说明一下这几个矩阵的作用,并且推导出其生成的过程。首先最主要的矩阵T,是负责旋转的矩阵。以下这个图片摘自网络,可以说较为完整的解释了这个矩阵的来历。

均值滤波和中值滤波

均值滤波与自适应中值滤波的仿真与实现 摘要 图像是一种重要的信息源,通过图像处理可以帮助人们了解信息的内涵,然而在图像使用和传输过程中,不可避免会受到噪声的干扰,因此为了恢复原始图像,达到好的视觉效果,需要对图像进行滤波操作。根据噪声种类不同,可以采用不同的滤波方法,均值滤波是典型的线性滤波算法,能够有效滤波图像中的加性噪声,而中值滤波器是能够有效滤除脉冲噪声的非线性滤波器,但传统中值滤波去脉冲噪声的性能受滤波窗口尺寸的影响较大, 在抑制图像噪声和保护细节两方面存在矛盾。本文首先对不同均值滤波器在处理不同噪声方面的优缺点进行了分析,然后分别用中值滤波器和自适应中值滤波器对被椒盐噪声污染的图像进行了滤波操作,发现自适应中值滤波方法不仅可以有效滤波椒盐噪声,同时还可以有效地克服中值滤波器造成图像边缘模糊的缺点。 1.均值滤波 均值滤波是典型的线性滤波算法,它是指在图像上对目标像素给一个模板,该模板包括了其周围的临近像素点和其本身像素点。再用模板中的全体像素的平均值来代替原来像素值。均值滤波也称为线性滤波,其采用的主要方法为邻域平均法。线性滤波的基本原理是用均值代替原图像中的各个像素值,即对待处理的当前像素点(x,y),选择一个模板,该模板由其邻近的若干像素组成,求模板中所有像素

的均值,再把该均值赋予当前像素点(x,y),作为处理后图像在该点上的灰度

值g(x,y),即g(x,y)=1/m ∑f(x,y), m为该模板中包含当前像素在内的像素总个数。均值滤波能够有效滤除图像中的加性噪声,但均值滤波本身存在着固有的缺陷,即它不能很好地保护图像细节,在图像去噪的同时也破坏了图像的细节部分,从而使图像变得模糊。均值滤波主要有算术均值滤波,几何均值滤波,谐波均值滤波以及逆谐波均值滤波,本文只对算术均值滤波,几何均值滤波和逆谐波均值滤波进行研究。其中几何均值滤波器所达到的平滑度可以与算术均值滤波器相比,但在滤波过程中丢失更少的图象细节。逆谐波均值滤波器更适合于处理脉冲噪声,但它有个缺点,就是必须要知道噪声是暗噪声还是亮噪声,以便于选择合适的滤波器阶数符号,如果阶数的符号选择错了可能会引起灾难性的后果。下面分别对算术平均滤波,几何平均滤波和逆谐波均值滤波对不同噪声的滤波效果进行仿真分析。

C语言图形开发库函数graphics

函数名: fillellipse 功能: 画出并填充一椭圆 用法: void far fillellipse(int x, int y, int xradius, int yradius); 程序例: #include #include int main(void) { int gdriver = DETECT, gmode; int xcenter, ycenter, i; initgraph(&gdriver,&gmode,""); xcenter = getmaxx() / 2; ycenter = getmaxy() / 2; for (i=0; i<13; i++) { setfillstyle(i,WHITE); fillellipse(xcenter,ycenter,100,50); getch(); } closegraph(); return 0; } Graphics 类 .NET Framework 类库 Graphics 类 封装一个GDI+ 绘图图面。无法继承此类。 命名空间:System.Drawing 程序集:System.Drawing(在system.drawing.dll 中) 语法 Visual Basic(声明)

Public NotInheritable Class Graphics Inherits MarshalByRefObject Implements IDeviceContext, IDisposable Visual Basic(用法) Dim instance As Graphics C# public sealed class Graphics : MarshalByRefObject, IDeviceContext, IDisposable C++ public ref class Graphics sealed : public MarshalByRefObject, IDeviceContext, IDisposable J# public final class Graphics extends MarshalByRefObject implements IDeviceContext, IDisposable JScript public final class Graphics extends MarshalByRefObject implements IDeviceContext, IDisposable 备注 Graphics类提供将对象绘制到显示设备的方法。Graphics与特定的设备上下文关联。 通过调用从System.Windows.Forms.Control继承的对象的Control.CreateGraphics方法,或通过处理控件的Control.Paint事件并访问System.Windows.Forms.PaintEventArgs类的Graphics属性,可以获取Graphics。 继承层次结构 System.Object System.MarshalByRefObject System.Drawing.Graphics 线程安全 此类型的任何公共静态(Visual Basic 中的Shared)成员都是线程安全的,但不保证所有实例成员都是线程安全的。 平台 Windows 98、Windows 2000 SP4、Windows CE、Windows Millennium Edition、Windows Mobile for Pocket PC、Windows Mobile for Smartphone、Windows Server 2003、Windows XP Media Center Edition、Windows XP Professional x64 Edition、Windows XP SP2、Windows XP Starter Edition

中值滤波&均值滤波

数字图像处理作业(中值滤波&均值 滤波) 学院:电子信息工程学院 专业:控制工程 姓名:苏良碧

1中值滤波 1.1、中值滤波原理: 中值滤波是基于排序统计理论的一种能有效抑制噪声的非线性信号处理技术,中值滤波的基本原理是把数字图像或数字序列中一点的值用该点的一个邻域中各点值的中值代替,让周围的像素值接近的真实值,从而消除孤立的噪声点。方法是去某种结构的二维滑动模板,将板内像素按照像素值的大小进行排序,生成单调上升(或下降)的为二维数据序列。二维中值滤波输出为g(x,y)=med{f(x-k,y-l),(k,l∈W)},其中,f(x,y),g(x,y)分别为原始图像和处理后图像。W为二维模板,通常为2*2,3*3区域,也可以是不同的的形状,如线状,圆形,十字形,圆环形等。 1.2、实现方法: (1)通过从图像中的某个采样窗口取出奇数个数据进行排序; (2)用排序后的中值取代要处理的数据即可; 1.3、matlab程序(zhongzhilvbo.m) clear; close all; I=imread('I3_256.bmp'); figure,imshow(I),title('原始图象'); J=imnoise(I,'salt&pepper',0.02); imshow(J);title('噪声干扰图像') X=J;a=3;b=3;%3*3的邻域 k=floor(a*b/2)+1;%求出中值,即k=5 [M,N]=size(X);%求出输入图像的行数M和列数N uint8Y=zeros(M,N); funBox=zeros(a,b); temp=zeros(a*b); %X(a:b,c:d)表示A矩阵的第a到b行,第c到d列的所有元素 for i=1:M-a for j=1:N-b funBox=X(i:i+a,j:j+b);%把图像中的一个3*3领域赋给funbox temp=funBox(:);%把领域中的每个元素赋给temp tempSort=sort(temp);%对其中的像素值进行排序 Y(i,j)=tempSort(k);%将模板的中值(k=5)赋给模板中

opencv 图像翻转旋转

opencv 图像翻转、旋转 转自: https://www.wendangku.net/doc/5f1357833.html,/watkinsong/article/details/9189649 1.图像左右翻转、翻转90度 opencv中并没有直接封装图像旋转任意角度的函数,一般我们可以使用仿射变换获得旋转后的图像,这时候可以进行任意角度的旋转,但是如果我们需要将图像旋转90度,例如只是对图像进行左右翻转,或者旋转90度将图像放倒,那么如果还使用仿射变换,显得有些不是很简单,有点过于复杂。实际上可以使用求转置矩阵的方式将图像旋转90度,然后可以沿着指定的坐标轴对旋转后的图像进行翻转变化。使用transpose(src, dst);对目标图像进行转置变换,可以将垂直的图像变为水平放置。然后使用flip()函数对图像进行翻转。整个过程非常简单,可以看下下面的代码就非常清晰的了解了。// ImageFlip.cpp : Defines the entry point for the console application. //#include "stdafx.h" #include "opencv/cv.h" #include "opencv/highgui.h" #include "stdio.h" #include "iostream"using namespace cv;

using namespace std;int _tmain(int argc, _TCHAR* argv[]) { Mat src = imread("lena.jpg"); Mat dst; transpose(src, dst); Mat dst2; flip(dst, dst2, 1); // flip by y axis Mat dst3; flip(dst, dst3, 0); // flip by x axis Mat dst4; flip(dst, dst4, -1); // flip by both axises imshow("src", src); imshow("dst", dst); imshow("dst2", dst2); imshow("dst3", dst3); imshow("dst4", dst4); cvWaitKey(); return 0; } 实验结果:原始图像: 转置以后: flip(dst, dst2, 1); // flip by y axis2、任意角度旋转、同时缩放(输出图像大小与输入图像大小相同,容易造成图像不全)下面这份代码用于实现对图像的缩放与旋转。

自适应中值滤波器matlab实现

将下面代码直接贴入matlab中,并将读入图像修改成自己机子上的,就可以运行了。可以按照“%%”顺序分步来运行 %% function 自适应中值滤波器 %%%%%%%%%%%%%%% %实现两个功能: %1.对高密度的椒盐噪声有好的滤除效果; %2.滤波时减少对图像的模糊; %%%%%%%%%%%%%%% %%%%%%%%%%%%%%% %原理: %1.椒盐噪声概率越大,滤波器窗口需越大。故若滤波器窗口随噪声概率自适应变化,才能有好的滤除效果 %2.为减少对图像的模糊,需在得出原图像值并非椒盐噪声点时,保留原图像值不变; %3.椒盐噪声点的特点:该点的值为该点领域上的最大或最小;%%%%%%%%%%%%%%% %%%%%%%%%%%%%%% %步骤(得到图像中某点(x,y)(即窗口中心点)的值的步骤): %1.设定一个起始窗口,以及窗口的最大尺寸; %2.(此步用于确定窗口大小)对窗口内像素排序,判断中值是否是噪声点,若不是,继续第3步,若是,转到第5步; %3.判断中心点是否是噪声点,若不是,则输出该点的值(即图像中该点的原值不变);若是,则输出中值; %4.窗口尺寸增大,若新窗口尺寸小于设定好的最大值,重复第2步,若大于,则滤波器输出前一个窗口的中值; %%%%%%%%%%%%%%% %%%%%%%%%%%%%%% %参数说明:

%被噪声污染的图像(即退化图像也即待处理图像):Inoise %滤波器输出图像:Imf %起始窗口尺寸:nmin*nmin(只取奇数),窗口尺寸最大值:nmax*nmax %图像大小:Im*In %窗口内图像的最大值Smax,中值Smed,最小值Smin %%%%%%%%%%%%%%%%%%%% %% clear clf %% 读入图像I I=imread('e:/photo/cat.jpg'); %转化为灰度图Ig Ig=rgb2gray(I); %被密度为0.2的椒盐噪声污染的图像Inoise Inoise=imnoise(Ig,'salt & pepper',0.2); %或者是被方差为0.2的高斯噪声污染的图像Inoise %Inoise=imnoise(Ig,'gaussian',0.2); %显示原图的灰度图Ig和噪声图像Inoise subplot(2,2,1),imshow(Ig);xlabel('a.原始灰度图像'); subplot(2,2,2),imshow(Inoise);xlabel('b.被噪声污染的图像'); %% 定义参数 %获取图像尺寸:Im,In [Im,In]=size(Inoise); %起始窗口尺寸:nmin*nmin(窗口尺寸始终取奇数) nmin=3; %最大窗口尺寸:nmax*nmax nmax=9; %定义复原后的图像Imf Imf=Inoise; %为了处理到图像的边界点,需将图像扩充

编程实现一幅图像的平移、镜像、旋转、缩小和放大

课程设计任务书 学生姓名:专业班级:通信1003班 指导教师:郭志强工作单位:信息工程学院 题目: 通信工程应用技术 初始条件: (1)使用matlab软件进行操作 (2)选择一个图像进行处理 要求完成的主要任务:(包括课程设计工作量及其技术要求,以及说明书撰写等具体要求)(1)编程实现一幅图像的平移、镜像、旋转、缩小和放大。 (2)给出所用算法的理论依据和必要的推导过程,给出原始图像和处理后的图像。时间安排: 第15周:安排任务,布置题目; 第15—18周:设计仿真,撰写报告 第19周:完成设计,提交报告,答辩 指导教师签名:年月日 系主任(或责任教师)签名:年月日

目录 摘要.................................................................................................................................................................. I Abstract ........................................................................................................................................................... I I 1 MA TLAB简介 .. (1) 1.1 MA TLAB用途 (1) 2图像选择及变换 (4) 2.1 原始图像选择读取 (4) 2.2 图像放大和缩小 (6) 2.2.1 图像放大缩小的知识 (6) 2.2.2 函数说明及参数选择 (8) 2.2.3 源程序及运行结果 (8) 2.3 图像任意角度的旋转 (10) 2.3.1 函数说明及参数选择 (10) 2.3.2 源程序及运行结果 (10) 2.4 图像的平移 (12) 2.4.1 函数说明及参数选择 (12) 2.4.2 源程序及运行结果 (13) 2.5 图像经过镜像 (13) 3.5.1 函数说明及参数选择 (13) 2.5.2 源程序及运行结果 (14) 4 感悟体会小结 (17) 5 参考文献 (18) 附录 (19) 全部源程序代码: (19)

相关文档