天津科技大学数字图像处理---数字图像处理实验报告

实验三 图像的平滑

实验目的: 掌握opencv开发环境中对灰度图像及彩色图像中的像素的访问方法 掌握opencv中对图像进行处理的基本过程。 掌握均值平滑和中值滤波的基本原理

实验内容: (1)打开一幅灰度图像,对图像进行3*3(包括中心点)的邻域平均处理。 (2)对原图进行3*3(包括中心点)的中值滤波处理。

(3)比较原图像与邻域平均的图像、中值滤波后的图像的差异。 实验步骤:1、打开计算机,启动MATLAB或VB,VC程序;

2、调入“实验1”中获取的数字图像,使用不同的平滑滤波器对图像进行平滑 处理并比较所得不同的图像效果。 3、记录和整理实验报告 源代码:

1、中值滤波

%自编的中值滤波函数。x是需要滤波的图像,n是模板大小(即n×n) function d=mid_filter(x,n)

[height, width]=size(x); %输入图像是p×q的,且p>n,q>n x1=double(x); x2=x1;

for i=1:height-n+1 for j=1:height-n+1

c=x1(i:i+(n-1),j:j+(n-1)); %取出x1中从(i,j)开始的n行n列元素,即模板(n×n的) e=c(1,:); %是c矩阵的第一行 for u=2:n

e=[e,c(u,:)]; %将c矩阵变为一个行矩阵 end

mm=median(e); %mm是中值

x2(i+(n-1)/2,j+(n-1)/2)=mm; %将模板各元素的中值赋给模板中心位置的元素 end end

%未被赋值的元素取原值 d=uint8(x2);

2、邻域平均法 I=imread('Miss.bmp');

J=imnoise(I,'gaussian',0.02); %添加高斯噪声 subplot(231);imshow(I);title('原图像');

subplot(232);imshow(J); title('添加高斯噪声图像')

k1=filter2(fspecial('average',3),J); %进行3×3模板平滑滤波 k2=filter2(fspecial('average',5),J); %进行5×5模板平滑滤波 k3=filter2(fspecial('average',7),J); %进行7×7模板平滑滤波

k4=filter2(fspecial('average',9),J); %进行9×9模板平滑滤波 subplot(233);imshow(uint8(k1));title('3×3模板平滑滤波'); subplot(234);imshow(uint8(k2));title('5×5模板平滑滤波'); subplot(235); imshow(uint8(k3)); title('7×7模板平滑滤波'); subplot(236); imshow(uint8(k4)); title('9×9模板平滑滤波');

实验心得:平滑技术用于平滑图像的噪声,平滑噪声可以在空间域中进行,基本 方法是求像素灰度的平均值或中值。但是这些很容易引起边缘的模 糊,常用的有均值滤波、中值滤波,在使用时,针对不同的噪声,也 需要不同的滤波法,没有哪种方法是绝对好,必须具体情况具体分析。 最后比较三种平滑效果,八点平滑最好,说明对高斯噪声平滑滤波效 果较好。中值滤波基本把椒盐噪声都滤去了,说明中值滤波对椒盐噪 声平滑效果比高斯噪声好。

实验四 图像的直方图均衡化

实验目的: 掌握直方图均衡化的基本步骤及实现方法 掌握opencv中对图像进行处理的基本过程。

实验内容: (1)打开一幅灰度图像,对图像进行直方图均衡化处理。 (2)比较原图像与均衡化的图像的差异。

(3)要求自己按照课本介绍的均衡化的步骤在opencv下实现直方图均衡化处 理。 实验步骤:(I)直方图均衡化的过程:

1)列出原始图像和变换后图像的灰度级(L是灰度级的个数); 3)计算原始图像直方图P(i)=Ni/N;

4)计算累计直方图P(j)=P(1) + P(2) + P(3) +?+ P(i);

5)利用灰度值变换函数计算变换后的灰度值,兵四舍五入取整; j=INT[(L-1)Pj+0.5]

6)确定灰度变换关系i→j,据此将原图像的灰度值f(m,n)=i修正为g(m,n) =j;

7)统计变换后个灰度级的像素个数Nj; 8)计算变换后图像的直方图Pj=Nj/N

源代码:

// perform histgram equalization for single channel image // AssureDigit Sample code //

#include \

#include \

#define HDIM 256 // bin of HIST, default = 256 int main( int argc, char** argv ) {

IplImage *src = 0, *dst = 0; CvHistogram *hist = 0;

int n = HDIM; double nn[HDIM]; uchar T[HDIM]; CvMat *T_mat;

int x;

int sum = 0; // sum of pixels of the source image 图像中象素点的总和 double val = 0;

if( argc != 2 || (src=cvLoadImage(argv[1], 0)) == NULL) // force to gray image return -1;

cvNamedWindow( \ cvNamedWindow( \

// calculate histgram 计算直方图

hist = cvCreateHist( 1, &n, CV_HIST_ARRAY, 0, 1 ); cvCalcHist( &src, hist, 0, 0 );

// Create Accumulative Distribute Function of histgram val = 0;

for ( x = 0; x < n; x++) {

val = val + cvGetReal1D (hist->bins, x); nn[x] = val; }

// Compute intensity transformation 计算变换函数的离散形式 sum = src->height * src->width; for( x = 0; x < n; x++ ) {

T[x] = (uchar) (255 * nn[x] / sum); // range is [0,255] }

// Do intensity transform for source image dst = cvCloneImage( src );

T_mat = cvCreateMatHeader( 1, 256, CV_8UC1 ); cvSetData( T_mat, T, 0 );

// directly use look-up-table function 直接调用内部函数完成 look-up-table 的过程 cvLUT( src, dst, T_mat );

联系客服:779662525#qq.com(#替换为@) 苏ICP备20003344号-4