2018-05-26 19:24:22 klaus_x 阅读数 1522

数字图像处理 实验2

基本实验1

理解傅里叶谱和相位谱在视觉中的作用
程序代码:

clear;
RGB=imread('yangmi.bmp');%个人照片
I=rgb2gray(RGB); %x=rgb2gray(I);%彩色转灰度
figure;
subplot(221); imshow(I);
title('原始图像')
fi = fftshift(fft2(I));
fi_magn = abs(fi);
subplot(222); imshow(log(1+fi_magn),[]);
title('频谱图像');
fi_angl = angle(fi);
subplot(223);imshow(fi_angl,[]);
title('相位图像');
fi_shape = fi./fi_magn;
i_shape = ifft2(ifftshift(fi_shape));
subplot(224);
imshow(i_shape,[]);
title('形状图像')

实验结果:
6
最后一张图,你们能看到杨幂的轮廓嘛???笑哭…笑哭

基本实验2:

对一副图像加入椒盐噪声后,实现2阶Butterworth低通滤波
程序代码如下:

clear;
RGB=imread('saturn.png');
I=rgb2gray(RGB);
subplot(221);imshow(I);title('原图')
I2 = imnoise(I,'salt & pepper');
subplot(222);imshow(I2);title('噪声图像');
[row,col]=size(I);
P = row*2;    Q = col*2;
f = zeros(P,Q);
f(1:row,1:col) = double(I2);
g = fft2(f);
g = fftshift(g);
result_ideal = zeros(P,Q);
result_buter = zeros(P,Q);
N = 2;%巴特沃斯滤波阶数
D0 = 50;%滤波半径
center_x = fix(P/2);
center_y = fix(Q/2);
tic;
for i=1:P
    for j=1:Q
        d_uv = sqrt((i-center_x)^2+(j-center_y)^2);
        h_ij = 1/(1+(d_uv/D0)^(2*N));
        result_buter(i,j) = h_ij*g(i,j);
        if(d_uv>D0)
            result_ideal(i,j)=0;
        else
            result_ideal(i,j)=g(i,j);
        end
    end
end
toc;
result_ideal = ifftshift(result_ideal);
result_buter = ifftshift(result_buter);
X1 = ifft2(result_buter);X2=uint8(real(X1));
result_B = X2(1:row,1:col);
subplot(223);imshow(result_B);
title('Butterworth滤波结果');
X3 = ifft2(result_ideal);X4=uint8(real(X3));
result_I = X4(1:row,1:col);
subplot(224);imshow(result_I);
title('理想滤波器滤波结果');

实验现象图
7
实验二涉及的数据比较多,博主建议给小一点的图像,也就是画质低一点的,上面这种图大概运行了大概运行了5秒左右(不能忍有木有!!!);同时为了加快速度,也可以提前对迭代的数组赋值,减少运行时间。

基本实验3

对一幅图像moon.tif实现高斯高频强调滤波
程序代码:

clear;
I = imread('chest_xray.tif');
figure;
subplot(221);imshow(I);title('原始图像');
%%
D0=40;
k1=0.5;
k2=0.75;
%%
[row,col]=size(I);
P = row*2;Q=col*2;
f = zeros(P,Q);
f(1:row,1:col)=double(I);
g=fft2(f);
g=fftshift(g);
center_x=fix(P/2);
center_y=fix(Q/2);
tic;

for i=1:P
    for j=1:Q
        duv2=(i-center_x)^2+(j-center_y)^2;
        h_uv=1-exp((-duv2/(2*D0*D0)));
        h_ij=k1+k2*h_uv;
        result_hp(i,j)=h_uv*g(i,j);
        result_hb(i,j)=h_ij*g(i,j);
    end
end

toc;
result_hp = uint8(real(ifft2(ifftshift(result_hp))));%进行反变换
result_hb = uint8(real(ifft2(ifftshift(result_hb))));%进行反变换
result_hp2=result_hp(1:row,1:col);
subplot(222);imshow(result_hp2);
title('高斯高通滤波图像')
result_hb2=result_hb(1:row,1:col);
subplot(223);imshow(result_hb2);
title('高频强调图像');
resutlt_histeq=histeq(result_hb2);
subplot(224);
imshow(resutlt_histeq
);
title('经过直方图均衡化的结果')

实验现象结果
8

思考题

已知一同态滤波器的传输特性曲线如下图所示
9
该滤波器的传递函数为:

H(u,v)=(γHγL)[1ec[D2(u,v)D02]]+γL

设参数γH=2,γL=0.25,c=1,D0=80
使用该同态滤波器对下图进行处理,编写M文件。
程序源码:

clear;
I = imread('moon.tif');
subplot(121);imshow(I);title('原图')
%%--------------------------
result_tt(1000,1000)=0;
rL=0.25;
rH=2;
c=1;
%%---------------------------
[row,col]=size(I);
P = row*2;    Q = col*2;
f = zeros(P,Q);
f(1:row,1:col)=double(I);
g = fft2(f);
g = fftshift(g);
D0 = 80;
center_x = fix(P/2);
center_y = fix(Q/2);
tic;
for i=1:P
    for j=1:Q
        d_uv = sqrt((i-center_x)^2+(j-center_y)^2);
        tmp=1-exp(c*(d_uv*d_uv/D0*D0));
        h_ij = (rH-rL)*tmp+rL;
        result_tt(i,j) = h_ij*g(i,j);
        if(d_uv>D0)
            result_tt(i,j)=g(i,j);
        else
            result_tt(i,j)=0;
        end
    end
end
toc;
result_tt = ifftshift(result_tt);
X1 = ifft2(result_tt);X2=uint8(real(X1));
result_B = X2(1:row,1:col);
subplot(122);imshow(result_B);
title('同态滤波结果');

实验结果:
10
如果需要下载我的文件的话,这里是程序源码和思考题的代码和文件夹的下载链接
下载文件为压缩包形式。

2017-04-06 15:42:11 The_star_is_at 阅读数 721
//  Created by liuzhe on 17/3/30.

%-- 17-3-27 上午7:44 --%
%-- 17-3-27 上午7:49 --%
I_huidu=imread('pout.tif');
I_erzhi=inread('circles.png');
I_erzhi=imread('circles.png');
I_erzhi2=imread('blobs.png');
I_erzhi=imread('circles.png');
figure(1),imshow(I_huidu);
figure(2),imshow(I_erzhi);
figure(3),imshow(I_erzhi2);
[I_suoyin,colormap]=imread('trees.tif');
figure(4),imshow(I_suoyin,colormap);
figure(5),imshoew(I_suoyin);
figure(5),imshow(I_suoyin);
figure(5),imshow(colormap);
I_RGB=imread('peppers.png');
I_RGB=imread('peppers.png')
figure(6),imshow(I_RGB);
R=I_RGB(:,:,1);
figure(100),imshow(R);
G = I_RGB(:,:,2);
B = I_RGB(:,:,3);
figure(G),imshow(G);
figure(101),imshow(G);
figure(102),imshow(B);
subplot(2,2,1),imshow(I_RGB);
subplot(2,2,2),imshow(R);
subplot(2,2,3),imshow(G);
subplot(2,2,4),imshow(B);
I_RGB=imread('pappers.png');
I=imread('pout.tif');
GA = imnoise(I,'gaussian');
imwrite(GA,'GApout.tif');
subplot(1,3,1),imshow(I);
subplot(1,3,2),imshow(GA);
PS = imnoise(I,'salt & pepper');
subplot(1,3,3),imshow(PS);
imwrite(PS,'PSpout.tif');

2019-11-29 22:04:40 EscapeX 阅读数 42

DIP实验3:图像的锐化处理

实验目的

锐化的目的是加强图像的边界和细节,熟悉Robert、Sobel和Laplace算子进行检测,使图像特征(如边缘、轮廓等)进一步增强并突出。

实验内容

1)编写Robert算子滤波函数;
2)编写Sobel算子滤波函数;
3)编写Laplace算子滤波函数;
4)编写限幅和标定函数,给出增强后的图像。

输出图像排列格式如下:

原图像 Robert算子滤波结果 Sobel算子滤波结果 Laplace算子滤波结果
Robert算子增强结果 Sobel算子增强结果 Laplace算子增强结果

参考代码

figure('NumberTitle', 'off', 'Name', '实验3:图像的锐化处理');
OI = imread('rice.bmp');    % 原始图像读取 
 
subplot(2,4,1);
imshow(OI);
title('原始图像'); 
 
subplot(2,4,2);
r1 = [0 -1; 1 0];
r2 = [-1 0; 0 1];
rob = RobertFilter(OI, r1, r2);
imshow(rob);
title('Robert算子滤波结果');
 
subplot(2,4,3);
s1 = [-1 -2 -1; 0 0 0; 1 2 1];
s2 = [-1 0 1; -2 0 2; -1 0 1]; 
sob = SobelFilter(OI, s1, s2);
imshow(sob);
title('Sobel算子滤波结果');
 
subplot(2,4,4);
l = [1 1 1; 1 -8 1; 1 1 1];
lap = LaplaceFilter(OI, l);
lapcal = Caliberation(lap);
imshow(lapcal);
title('Laplace算子滤波结果');
 
subplot(2,4,6);
OIrob = OI + rob;
larob = LimitAmplitude(OIrob);
imshow(larob);
title('Robert算子增强结果');
 
subplot(2,4,7);
OIsob = OI + sob;
lasob = LimitAmplitude(OIsob);
imshow(lasob);
title('Sobel算子增强结果');
 
subplot(2,4,8);
OIlap = OI - uint8(lap);
lalap = LimitAmplitude(OIlap);
imshow(lalap);
title('Laplace算子增强结果');
 
function rob = RobertFilter(OI, r1, r2)
    [M, N] = size(OI);
    f = zeros(M+1, N+1);
    % 边界填充
    f(1:M, 1:N) = OI(1:M, 1:N);
    f(1:M, N+1:N+1) = OI( : , N:N);
    f(M+1:M+1, 1:N) = OI(M:M, : );
    g = zeros(M+1, N+1);
    for x = 1: M
        for y = 1: N
            % M(x, y) = |z9-z5| + |z8-z6|
            mat = [f(x, y) f(x, y+1); f(x+1, y) f(x+1, y+1)];
            gr1 = mat .* r1;
            gr2 = mat .* r2;
            g(x, y) = abs(sum(gr1(:))) + abs(sum(gr2(:)));
        end
    end
    Img = zeros(M, N);
    Img(1:M, 1:N) = g(1:M, 1:N);
    rob = uint8(Img); 
end
 
function sob = SobelFilter(OI, s1, s2)
    [M, N] = size(OI);
    [m, n] = size(s1);
    f = zeros(M+m-1, N+n-1);
    % 边界填充
    f((m-1)/2+1:M+(m-1)/2, (n-1)/2+1:N+(n-1)/2) = OI(1:M, 1:N);
    f((m-1)/2+1:M+(m-1)/2, 1:(n-1)/2) = OI( : , 1:(n-1)/2);
    f((m-1)/2+1:M+(m-1)/2, N+(n-1)/2:N+m-1) = OI( : , N-(n-1)/2:N);
    f(1:(m-1)/2, (n-1)/2+1:N+(n-1)/2) = OI(1:(m-1)/2, : );
    f(M+(m-1)/2:M+m-1, (n-1)/2+1:N+(n-1)/2) = OI(M-(m-1)/2:M, : );
    g = zeros(M+m-1, N+n-1);
    for x = (m-1)/2+1 : M+(m-1)/2
        for y = (n-1)/2+1 : N+(n-1)/2
            % M(x, y) = |(z7+2z8+z9)-(z1+2z2+z3)| + |(z3+2z6+z9)-(z1+2z4+z7)|
            mat = [f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1); f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
            gs1 = mat .* s1;
            gs2 = mat .* s2;
            g(x, y) = abs(sum(gs1(:))) + abs(sum(gs2(:)));
        end
    end
    Img = zeros(M, N);
    Img(1:M, 1:N) = g((m-1)/2+1 : M+(m-1)/2, (n-1)/2+1 : N+(n-1)/2);
    sob = uint8(Img);  
end
 
function lap = LaplaceFilter(OI, l)
    [M, N] = size(OI);
    [m, n] = size(l);
    f = zeros(M+m-1, N+n-1);
    % 边界填充
    f((m-1)/2+1:M+(m-1)/2, (n-1)/2+1:N+(n-1)/2) = OI(1:M, 1:N);
    f((m-1)/2+1:M+(m-1)/2, 1:(n-1)/2) = OI( : , 1:(n-1)/2);
    f((m-1)/2+1:M+(m-1)/2, N+(n-1)/2:N+m-1) = OI( : , N-(n-1)/2:N);
    f(1:(m-1)/2, (n-1)/2+1:N+(n-1)/2) = OI(1:(m-1)/2, : );
    f(M+(m-1)/2:M+m-1, (n-1)/2+1:N+(n-1)/2) = OI(M-(m-1)/2:M, : );
    g = zeros(M+m-1, N+n-1);
    for x = (m-1)/2+1 : M+(m-1)/2
        for y = (n-1)/2+1 : N+(n-1)/2
            mat = [f(x-1,y-1) f(x-1,y) f(x-1,y+1); f(x,y-1) f(x,y) f(x,y+1); f(x+1,y-1) f(x+1,y) f(x+1,y+1)];
            gl = mat .* l;
            g(x, y) = sum(gl(:));
        end
    end
    Img = zeros(M, N);
    Img(1:M, 1:N) = g((m-1)/2+1 : M+(m-1)/2, (n-1)/2+1 : N+(n-1)/2);
    lap = Img;
%     lap = uint8(Img);
end
 
% 标定函数 Caliberation
function cal = Caliberation(OI)
    OI = double(OI);
    [M, N] = size(OI);
    fmin = min(min(OI));
    fm = OI - fmin * ones(M, N);
    fmmax = max(max(fm));
    fs = 255 * fm ./ fmmax;
    cal = uint8(fs);
end
 
% 限幅函数 LimitAmplitude
function la = LimitAmplitude(OI)
    [M,N]=size(OI);
    la = OI;
    for x=1:M
        for y=1:N
            if la(x,y) > 255
                la(x,y) = 255;
            elseif la(x,y) < 0
                la(x,y) = 0;
            else
                la(x,y) = la(x,y);
            end
        end
    end   
end

实验结果

在这里插入图片描述

2018-01-06 18:47:37 aninstein 阅读数 14063

前两节都是熟悉一下怎么在matlab底下对图片做一些操作,并没有什么卵用,这一节稍微有点卵用,灰度变换一般是图像处理的第一步。

数字图像处理实验1-9点击下列链接有源码和链接:

我们还是先写一个guide,然后打开文件的代码:

打开文件摁纽的代码:
% --- Executes on button press in 打开位图.
function openFile_Callback(hObject, ~, handles)
[filename,pathname]=uigetfile('*.bmp','select image');
str=[pathname filename];
[handles.I,handles.map]=imread(str);
guidata(hObject,handles);
axes(handles.axes1);
imshow(handles.I,handles.map);
把图片转换成灰度图片的代码:
% --- Executes on button press in 转灰度图.
function togray_Callback(hObject, eventdata, handles)
X=rgb2gray(handles.I);%就是这个函数把图片变成灰度图
guidata(hObject,handles);
axes(handles.axes3);
imshow(X,handles.map);

效果:


1.实现灰度直方图。

说明:一幅图像由不同灰度值的像素组成,图像中灰度的分布情况是该图像的一个重要特征。图像的灰度直方图就描述了图像中灰度分布情况,能够很直观的展示出图像中各个灰度级所占的多少。图像的灰度直方图是灰度级的函数,描述的是图像中具有该灰度级的像素的个数:

其中,横坐标是灰度级,纵坐标是该灰度级出现的频率。

代码:

% --- Executes on button press in 显示灰度直方图.
function grayBar_Callback(hObject, eventdata, handles)
X=rgb2gray(handles.I);
axes(handles.axes2);
imhist(X);

效果:


2.实现灰度线性变换。

说明:灰度图像主要针对独立的像素点进行处理,由输入像素点的灰度值来决定相应的输出像素点的灰度值,通过改变原始图像数据所占据的灰度范围而使图像在视觉上得到改观,由于灰度变换没有利用像素点之间的相互关系,因而这种处理方法也叫点运算。灰度变换法又分为线性变换和非线性变换,是根据他们采用的算法来定义的。

代码:

% --- Executes on button press in 线性变换.
function lineTransfrom_Callback(hObject, eventdata, handles)
X=rgb2gray(handles.I);
J=imadjust(X,[0.2 0.5],[0 1]);
axes(handles.axes2);
imshow(uint8(J));
这里的线性变换我偷懒直接取了(0.2,0.5)到(0,1)两个坐标画直线作为变换规则,但是也是线性对吧~

仔细的可以参考:matlab图像处理-线性变换和直方图均衡化


3.实现灰度非线性变换。

说明:灰度非线性变换:

(1)负相变换

负相变换也叫做反相变换,即对每一个像素值求反。对图像求反就是讲原图的灰度值反转,简单的说就是黑的变成白的,白的变成黑的。

对于灰度图像或彩色图像的每个通道,其算法为:g(x,y) = 255 - f(x,y)

(2)二值化和阈值处理

二值化是分段线性的一个特例,一副图像包括目标、背景和噪声,怎样从多值的灰度图像中提取出目标?最常用的方法就是设定一个阈值θ,用θ将图像的数据分成两部分:大于θ的像素群和小于θ的像素群。例如,输入图像为f(x,y),输出图像为f'(x,y),则f'(x,y) = 255(f(x,y) >= θ); f'(x,y) = 0(f(x,y) <= θ),这就是图像二值化处理,它的目标就是利用一个阈值θ将图像f(x,y)分成目标和背景两个领域。

(3)分段线性变换

分段线性变换也叫做灰度线性拉伸,常用的是分三段分线性变换。如下图:


图中对灰度区间[a,b]进行了扩展,而灰度区间[0, a]和[b, Mf]收到了压缩。通过细心调整折线拐点的位置及控制分段直线的斜率,可对任意灰度区间进行扩展和压缩。、

对于非线性灰度变化,只是算法实现和最终效果上有区别,与线性变换一样,都是为了改善图像的质量。

(4)对数变换,顾名思义就是以对数的函数图像作为变换规则。

这里只演示对数图像变换:

代码:

% --- Executes on button press in 对数变换.
function logTransfrom_Callback(hObject, eventdata, handles)
X=rgb2gray(handles.I);
J=double(X);
H=(log(J+1))/10;
axes(handles.axes2);
imshow(H,handles.map);

效果:


4.实现阈值变换。

阈值变换:灰度的阀值变换可以将一幅灰度图像转换成黑白二值图像。操作过程如下:先由用户指定一个阀值,如果图像中某像素的灰度值小于该阀值,则将该像素的灰度值设置为0,否则灰度值设置为255。

从编辑框输入阈值的代码:

% 阈值输入 
function threshold_Callback(hObject, eventdata, handles)
handles.user_entry = str2double(get(hObject,'string'));% 从编辑框中取出阈值,变为数值型
if isnan(handles.user_entry)
    errordlg('enter a numeric value','Bad Input','modal')
    uicontrol(hObject)
    return
end
guidata(hObject,handles)
进行阈值变换的代码:

% --- Executes on button press in 确认阈值并且进行阈值变换.
function confirmThreshold_Callback(hObject, eventdata, handles)
X=rgb2gray(handles.I);
J=X>handles.user_entry;
axes(handles.axes2);
imshow(J,handles.map);
效果:



5.实现均衡变换。

说明:直方图均衡主要用于增强动态范围偏小的图像的反差,其基本思想是把原始图像的直方图变换为均匀分布,从而增强灰度值的动态范围,以达到增强对比度的效果。
直方图均衡化算法如下:
1.归一化灰度频数直方图,得到频率直方图sk
2.用sk计算频率累计直方图tk,
3.tk做取整扩展:tk = int[(L - 1) * tk + 0.5],将直方图灰度映射尽量满整个灰度取值空间L
4.确定变换映射关系k->tk

5.根据映射关系变换图像灰度值

当然我们都不用管,直接上代码就可以:

% --- Executes on button press in 均衡化.
function Equalization_Callback(hObject, eventdata, handles)
X=rgb2gray(handles.I);
J=histeq(X);%直方图均衡化函数
axes(handles.axes2);
imshow(uint8(J));
效果:


2019-04-24 15:42:22 y1016354741 阅读数 110

欢迎关注微信公众号【电子物语】,后台回复【数字图像处理】获取全文和代码

在这里插入图片描述

实验一 图象显示

1. 目的

掌握在计算机上显示图象的方法

2. 实验内容

  1. 熟悉参考程序DISP.c,熟悉C语言。
  2. 输入图象显示源程序DISP.c,建立C语言程序调试环境。
  3. 在计算机屏幕上显示指定的图象A2,B2。

3. 实验效果

Code Click Here
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验二 图像的二维傅立叶变换

1. 目的

掌握在计算机上进行二维傅立叶变换的编程方法以及显示变换图象的方法

2. 实验内容

  1. 熟悉参考程序FFT.c。
  2. 输入图象源程序FFT.c,进行C语言程序调试。实现内容:在128128的黑色图像矩阵中心建立4444的白色矩阵图像点阵,并对该图像进行二维傅里叶变换,将原始图像及傅里叶频谱图都显示于屏幕上。

3. 实验效果

Code Click Here

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验三 图像的增强

1. 目的

掌握在计算机上进行线性增强、直方图均衡化的方法

2. 实验内容

  1. 编写线性化图像增强C语言程序及相应的显示程序。具体要求如图所示,其中分段线性变换函数的a=64,b=195,c=32。(灰度变化范围0——255.)
    在这里插入图片描述
  2. 对指定图象A2或B2进行线性增强,将原始图象及增强后的图象都显示于屏幕上,比较增强的效果。
  3. 对1)中的a、b、c三个参数进行修改(改变其对比度,亮度),改变分段线性变换函数,将增强后的图象显示于屏幕上。
  4. 对指定图象A2或B2进行图像灰度的反置(反转)变换,将原始图象及增强后的图象都显示于屏幕上。
  5. 编写直方图均衡化的C语言程序及相应的显示程序。
  6. 对指定图象A2或B2进行直方图均衡化,将原始图象及增强后的图象都显示于屏幕上,比较增强的效果

3. 实验效果

Code Click Here

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验四 图像的增强

1. 目的

掌握在计算机上进行进行图象平滑、图象锐化的方法

2. 实验内容

  1. 对指定图象A2或B2采用3×3如下四个模板分别进行四点平滑、八点平滑、五点平滑、九点平滑,将原始图象及增强后的图象都显示于屏幕上,比较增强的效果。
    在这里插入图片描述
  2. 对指定图象A2或B2用下面两个3×3加权模板进行平滑,将原始图象及增强后的图象都显示于屏幕上,比较增强的效果。
    在这里插入图片描述
  3. 对指定图象A2或B2用5×5模板进行平滑,将原始图象及增强后的图象都显示于屏幕上,比较增强的效果。
  4. 对指定图象A2或B2用3×3模板进行中值滤波增强,将原始图象及增强后的图象都显示于屏幕上,比较增强的效果。与采用均值滤波法的处理结果进行比较。
  5. 对指定图象A2或B2进行简单锐化(简单梯度算法、ROBERT算子),将原始图象及增强后的图象都显示于屏幕上,比较增强的效果。
  6. 对指定图象A2或B2分别使用如下算子进行拉普拉斯算子增强,将原始图象及增强后的图象都显示于屏幕上,比较增强的效果。与简单锐化的处理结果进行比较。
    在这里插入图片描述

3. 实验效果

Code Click Here
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

实验五 图像的二值化

1. 目的

掌握在计算机上进行进行图象二值化的方法

2. 实验内容

  1. 对指定图象进行直方图法二值化处理(以指定图像灰阶的平均值作为阈值),将原始图象及二值化后的图象都显示于屏幕上,查看图像分割的效果
  2. 对指定图象进行微分直方图法二值化处理,将原始图象及二值化后的图象都显示于屏幕上,查看图像分割的效果,并与2的结果进行比较。

3. 实验效果

Code Click Here

在这里插入图片描述
在这里插入图片描述

没有更多推荐了,返回首页