数字图像处理笔记

一、图像颜色模型处理

1.读入一幅彩色图像,显示图像以及R、G、B三个分量的图像。

2.把原图像转为HSV模型,显示H、S、V三个分量的图像。

3.把原图像转为灰度图像,显示灰度图像及其灰度直方图,并以bmp文件格式保存灰度图像。

img=imread('peppers.JPG');
subplot(2,2,1);
imshow(img)

subplot(2,2,2);imshow(img(:,:,1));%显示图像R分量
subplot(2,2,3);imshow(img(:,:,2));%显示图像G分量
subplot(2,2,4);imshow(img(:,:,3));%显示图像B分量

figure
subplot(2,2,1);
imshow(img)
img_hsv=rgb2hsv(img);%将RGB转换为HSV
subplot(2,2,2);imshow(img_hsv(:,:,1));%显示图像H分量
subplot(2,2,3);imshow(img_hsv(:,:,2));%显示图像S分量
subplot(2,2,4);imshow(img_hsv(:,:,3));%显示图像V分量


img_gray=rgb2gray(img);%将RGB转化成灰度图
figure,imshow(img_gray);%显示灰度图像
imhist(img_gray);%显示灰度直方图
imwrite(img_gray,'peppers_gray.bmp');%将灰度图像保存为bmp格式

二、图像逻辑运算

1.实现car.jpg和dessert.jpg两幅图像相加;实现hallforeground.bmp和hallback.bmp两幅图像相减;实现bird.jpg和birdtemplet.bmp两幅图像相乘。

2.读入一幅图像,对其进行平移、旋转、错切变换。

img_car=imread('car.jpg');
img_desert=imread('desert.jpg');
img_hallforeground=imread('hallforeground.bmp');
img_hallback=imread('hallback.bmp');
img_bird=imread('bird.jpg');
img_birdtemplet=imread('birdtemplet.bmp');

%相加
img_car_add_desert=imadd(img_car,img_desert);%将两幅图像相加
subplot(2,3,1)
imshow(img_car_add_desert);%显示相加后的照片

%相减
img_hallforeground_sub_hallback=imsubtract(img_hallback,img_hallforeground);%将两幅图像相减
subplot(2,3,2)
imshow(img_hallforeground_sub_hallback);%显示相减后的图片

%相乘
img_bird_mul_birdtemplet=immultiply(img_bird,img_birdtemplet);%将两幅图相乘
subplot(2,3,3)
imshow(img_bird_mul_birdtemplet);%显示相乘后的图片

%平移
img_translation=imtranslate(img_car,[-200,-50]);%对图像进行平移
subplot(2,3,4)
imshow(img_translation);%显示平移后的图片

%旋转
img_bird_rotation=imrotate(img_bird,45);%将图片旋转45度
subplot(2,3,5)
imshow(img_bird_rotation);%显示旋转后的图片

%图像错切
tform = maketform('affine',[1,0,0;0,1,0;50,100,1]);             % 创建tform结构
% 对图片进行平移,这里需要指定图像范围,否则观察不出效果
img_translation = imtransform(img_bird,tform,'XData',[1 size(img_bird,2)],'YData',[1 size(img_bird,1)]);
figure
subplot(3,1,1)
imshow(img_translation)         % 显示平移后的图片

tform = maketform('affine',[sqrt(2)/2 sqrt(2)/2 0;-sqrt(2)/2 sqrt(2)/2 0;0 0 1]);   % 创建tform结构
img_rotation = imtransform(img_bird, tform);                    % 对图片进行旋转45°
subplot(3,1,2)
imshow(img_rotation)            % 显示旋转后的图片

tform = maketform('affine',[1 0 0; 0.5 1 0;0 0 1]);             % 创建tform结构
img_shear = imtransform(img_bird, tform);                       % 对图片进行水平错切
subplot(3,1,3)
imshow(img_shear)               % 显示错切后的图片

三、图像离散傅里叶变换处理

1.产生如图1所示图像,其中图像大小为256×256,中间亮条为128×32,暗处=0,亮处=100。对其进行二维离散傅里叶变换,显示变换后的频谱和能量谱。

图 1

2.把图1中的中间亮条顺时针旋转45度,图像大小仍然为 256×256。对其进行二维离散傅里叶变换,显示变换后的频谱和能量谱。

3.对图1进行二维离散余弦变换,显示变换后的频谱。

img_prospect = 100*ones(128,32);                        % 生成前景
tform = maketform('affine',[1 0 0;0 1 0;112 64 1]);     % 创建平移tform
img = imtransform(img_prospect,tform,'XData',[1 256],'YData',[1 256]);  % 对前景平移,并产生背景
figure
subplot(1,3,1)
imshow(img)      % 显示图片

%图像离散傅里叶变换
img_fft = fft2(img);    % 对图片进行离散傅里叶变换
fshift = fftshift(img_fft);         % 直流分量移到频谱中心
spectrum = log(1+abs(fshift));      % 取对数
energy = spectrum.*2;               % 获得能量
subplot(1,3,2),imshow(spectrum,[]),title('原图 幅度谱')   % 显示幅度谱
subplot(1,3,3),imshow(energy,[]),title('原图 能量谱')     % 显示能量谱

%图像旋转后,离散傅里叶变换
img_rotation = imrotate(img,-45,'crop');        % 这里直接用imrotate对图片围绕中点旋转,-45°为顺时针45°
figure
subplot(1,3,1)
imshow(img_rotation)         % 显示旋转后的图片
img_fft = fft2(img_rotation);       % 对图片进行离散傅里叶变换
fshift = fftshift(img_fft);         % 直流分量移到频谱中心
spectrum = log(1+abs(fshift));      % 取对数
energy = spectrum.*2;               % 获得能量
subplot(1,3,2),imshow(spectrum,[]),title('旋转图 幅度谱')  % 显示幅度谱
subplot(1,3,3),imshow(energy,[]),title('旋转图 能量谱')           % 显示能量谱

%图像离散余弦变换
img_dct = dct2(img);        % 对图像进行离散余弦变换
spectrum = abs(img_dct);    % 计算频谱
figure,imshow(spectrum,[])  % 显示频谱

四、图像滤波

1.打开lotus.JPG图像,将其转为灰度图像,统计并显示其灰度直方图;对其进行分段线性变换;对其进行直方图均衡化。

2.读入一幅图像,对其添加椒盐噪声和高斯噪声,分别用均值滤波和中值滤波对含噪声的图像进行平滑处理。

3.打开qiguan.bmp图像,用频域滤波的方法分别设计理想滤波器和巴特沃斯滤波器,分别实现低通、高通滤波,并观察截止频率对滤波效果的影响。

4.打开gugong.jpg图像,对其进行同态滤波,以改善图像视觉效果。

5.两张带有不同噪声的图片,enigma.png带有随机噪声,text_stripes.png带有非随机噪声,请运用合适的图像增强技术,对以上两张图片进行图像处理,达到output_image文件夹里面的图片显示效果。

% ------题1------
img_lotus = imread('lotus.JPG');                    % 读取图片
img_lotus_gray = im2double(rgb2gray(img_lotus));    % RGB转灰度
figure
subplot(2,2,1),imshow(img_lotus_gray),title('原图 灰度图')       % 显示灰度图
subplot(2,2,2),imhist(img_lotus_gray),title('原图 灰度直方图')   % 显示灰度直方图
[h,w] = size(img_lotus_gray);           % 获取图像尺寸  h:height,高度;w:width 宽度
new_img = zeros(h,w);                   % 生成的新的图像
a = 30/256;b = 100/256;c= 75/256;d= 200/256; 
for x = 1 : w               % 最外层循环 宽度
    for y = 1 : h           % 内层循环   高度
        if img_lotus_gray(y,x)<a     % 在灰度图像中 按列从上至下循环 若(y,x)处值<a时 对图像进行下行处理
            new_img(y,x) = img_lotus_gray(y,x)*c/a;         %  分段处理
        elseif img_lotus_gray(y,x)<b                        % 若(y,x)处值<b时 对图像进行下行处理
            new_img(y,x) = (img_lotus_gray(y,x)-a)*(d-c)/(b-a)+c;
        else                 % 其他情况 做以下处理
            new_img(y,x) = (img_lotus_gray(y,x)-b).*(d)/(1-b)+d;
        end
    end
end
subplot(2,2,3),imshow(new_img),title('变换后 灰度图')          % 显示灰度图
subplot(2,2,4),imhist(new_img),title('变换后 灰度直方图')      % 显示灰度直方图

% ------题2------
img_lotus = imread('lotus.JPG');                        % 读取图片
img_noise_salt = imnoise(img_lotus,'salt & pepper');    % 添加椒盐噪声
img_noise_gaussian = imnoise(img_lotus,'gaussian');     % 添加高斯噪声
figure  
subplot(3,2,1),imshow(img_noise_salt),title('椒盐噪声图片')                  % 显示带有椒盐噪声的图片
subplot(3,2,2),imshow(img_noise_gaussian),title('高斯噪声图片')              % 显示带有高斯噪声的图片
img_ave_salt = imfilter(img_noise_salt,fspecial('average',[9,9]));          % 使用9×9的核对椒盐噪声进行均值滤波
img_ave_gaussian = imfilter(img_noise_gaussian,fspecial('average',[9,9]));  % 使用9×9的核对高斯噪声进行均值滤波
subplot(3,2,3),imshow(img_ave_salt),title('椒盐噪声均值滤波后图片')           % 显示均值滤波后的图片
subplot(3,2,4),imshow(img_ave_gaussian),title('高斯噪声均值滤波后图片')       % 显示均值滤波后的图片
img_gau_salt = imfilter(img_noise_salt,fspecial('gaussian',[9,9]));         % 使用9×9的核对椒盐噪声进行高斯滤波
img_gau_gaussian = imfilter(img_noise_gaussian,fspecial('gaussian',[9,9])); % 使用9×9的核对高斯噪声进行高斯滤波
subplot(3,2,5),imshow(img_gau_salt),title('椒盐噪声高斯滤波后图片')           % 显示高斯滤波后的图片
subplot(3,2,6),imshow(img_gau_gaussian),title('高斯噪声高斯滤波后图片')       % 显示高斯滤波后的图片

% ------题3------
img_qiguan = imread('qiguan.bmp');      % 读取图片
%figure,imshow(img_qiguan)               % 显示图片
% 下面为理想低通滤波器滤波
[M,N] = size(img_qiguan);               % 获取图片大小
filter_ideal_low = ones(M,N);
for i=1:M
    for j=1:N
        if(sqrt( ((i-M/2)^2) + ((j-N/2)^2) ) > 50)  % 设置滤波器截止频率为50Hz
            filter_ideal_low(i,j) = 0;
        end
    end
end
img_qiguan_fft = fftshift(fft2(img_qiguan));                    % 进行FFT变换并移动原点
img_filter_ideal_low = img_qiguan_fft .* filter_ideal_low;      % 应用滤波器到图片
img_filter_ideal_low = ifft2(ifftshift(img_filter_ideal_low));  % FFT逆变换得到图片
img_filter_ideal_low = abs(img_filter_ideal_low);               % 取绝对值
img_filter_ideal_low = img_filter_ideal_low/max(img_filter_ideal_low(:));   % 归一化
figure
subplot(2,2,1),imshow(img_filter_ideal_low),title('理想低通滤波器')          % 显示图片
% 下面为理想高通滤波器滤波
[M,N] = size(img_qiguan);               % 获取图片大小
filter_ideal_high = ones(M,N);
for i=1:M
    for j=1:N
        if(sqrt( ((i-M/2)^2) + ((j-N/2)^2) ) < 50)  % 设置滤波器截止频率为50Hz
            filter_ideal_high(i,j) = 0;
        end
    end
end
img_qiguan_fft = fftshift(fft2(img_qiguan));                        % 进行FFT变换并移动原点
img_filter_ideal_high = img_qiguan_fft .* filter_ideal_high;        % 应用滤波器到图片
img_filter_ideal_high = ifft2(ifftshift(img_filter_ideal_high));    % FFT逆变换得到图片
img_filter_ideal_high = abs(img_filter_ideal_high);                 % 取绝对值
img_filter_ideal_high = img_filter_ideal_high/max(img_filter_ideal_high(:));   % 归一化
subplot(2,2,2),imshow(img_filter_ideal_high),title('理想高通滤波器')            % 显示图片
% 下面为三阶低通巴特沃斯滤波器
[M,N] = size(img_qiguan);               % 获取图片大小
filter_butt_low = ones(M,N);
for i=1:M
    for j=1:N
        D = sqrt((i-M/2)^2+(j-N/2)^2);
        filter_butt_low(i,j) = 1/(1+(D/50).^(2.*3));   % 3阶50Hz的低通巴特沃斯滤波器
    end
end
img_qiguan_fft = fftshift(fft2(img_qiguan));                        % 进行FFT变换并移动原点
img_filter_butt_low = img_qiguan_fft .* filter_butt_low;            % 应用滤波器到图片
img_filter_butt_low = ifft2(ifftshift(img_filter_butt_low));        % FFT逆变换得到图片
img_filter_butt_low = abs(img_filter_butt_low);                     % 取绝对值
img_filter_butt_low = img_filter_butt_low/max(img_filter_butt_low(:));   % 归一化
subplot(2,2,3),imshow(img_filter_butt_low),title('巴特沃斯低通滤波器')     % 显示图片
% 下面为三阶高通巴特沃斯滤波器
[M,N] = size(img_qiguan);               % 获取图片大小
filter_butt_high = ones(M,N);
for i=1:M
    for j=1:N
        D = sqrt((i-M/2)^2+(j-N/2)^2);
        filter_butt_high(i,j) = 1-(1/(1+(D/50).^(2.*3)));   % 3阶50Hz的高通巴特沃斯滤波器
    end
end
img_qiguan_fft = fftshift(fft2(img_qiguan));                          % 进行FFT变换并移动原点
img_filter_butt_high = img_qiguan_fft .* filter_butt_high;            % 应用滤波器到图片
img_filter_butt_high = ifft2(ifftshift(img_filter_butt_high));        % FFT逆变换得到图片
img_filter_butt_high = abs(img_filter_butt_high);                     % 取绝对值
img_filter_butt_high = img_filter_butt_high/max(img_filter_butt_high(:));   % 归一化
subplot(2,2,4),imshow(img_filter_butt_high),title('巴特沃斯高通滤波器')       % 显示图片

% ------题4------
img_gugong = imread('gugong.jpg');      % 读取图片
figure
subplot(2,1,1)
imshow(img_gugong)               % 显示图片
% 下面是同态滤波的代码
%参数声明
rH = 0.8;
rL = 0.3;
c = 0.5;    %介于rH和rL之间
D0 = 0.5;
[M, N] = size(img_gugong(:,:,1));
img_gugong_log = log(double(img_gugong) + 1);       % 取对数
img_gugong_fft = fftshift(fft2(img_gugong_log));    % 傅里叶变换
% 通过上面参数创建同态滤波器
H_filter = zeros(M,N);
for i = 1:M
    x = i-(M/2);
    for j = 1:N
        y = j-(N/2);
        H_filter(i,j) = (rH - rL).*(1-exp(-c*((x ^ 2 + y ^ 2) / D0 ^ 2))) + rL;
    end
end
img_gugong_filter_1 = H_filter.*img_gugong_fft(:,:,1);       % 对R分量进行同态滤波
img_gugong_filter_2 = H_filter.*img_gugong_fft(:,:,2);       % 对G分量进行同态滤波
img_gugong_filter_3 = H_filter.*img_gugong_fft(:,:,3);       % 对B分量进行同态滤波
img_gugong_filter = cat(3,img_gugong_filter_1,img_gugong_filter_2,img_gugong_filter_3); % 三个分量组合
img_gugong_ifft = ifft2(ifftshift(img_gugong_filter));      % 逆变换
img_gugong_ifft = abs(real(img_gugong_ifft));               % 取实部
img_gugong_ifft = exp(img_gugong_ifft)-1;                   % 取指数
img_gugong_after = img_gugong_ifft/max(img_gugong_ifft(:)); % 归一化处理
subplot(2,1,2)
imshow(img_gugong_after)                             % 显示处理好的图片
% ------题5------
img_enigma = imread('enigma.png');                  % 读取图像enigma
img_enigma_med = medfilt2(img_enigma, [12, 12]);      % 对图像进行滤波操作
img_enigma_ave = imfilter(img_enigma_med,fspecial('average',[12,12]));  % 第二次操作
figure,imshow(img_enigma_ave)                       % 显示滤波后的图片
[Image color] = imread('text_stripes.png');         % 读取索引图像
img_stripes = ind2rgb(Image,color);                 % 索引图像转RGB
%imshow(img_stripes)                                 % 显示图像
img_stripes_gray = rgb2gray(img_stripes);
[M,N] = size(img_stripes_gray);               % 获取图片大小
filter_butt_high = ones(M,N);
for i=1:M
    for j=1:N
        D = sqrt((i-M/2)^2+(j-N/2)^2);
        filter_butt_high(i,j) = 1-(1/(1+(D/60).^(2.*3)));   % 3阶50Hz的高通巴特沃斯滤波器
    end
end
img_stripes_fft = fftshift(fft2(img_stripes));                              % 进行FFT变换并移动原点
img_filter_butt_high = img_stripes_fft .* filter_butt_high;                 % 应用滤波器到图片
img_filter_butt_high = ifft2(ifftshift(img_filter_butt_high));              % FFT逆变换得到图片
img_filter_butt_high = abs(img_filter_butt_high);                           % 取绝对值
img_filter_butt_high = img_filter_butt_high/max(img_filter_butt_high(:));   % 归一化
enhanced_image = imadjust(img_filter_butt_high, [0 0.7], [0 1], 0.6);       % 图像调整
enhanced_image = 1 - enhanced_image;                                        % 黑白翻转
img_end = im2bw(enhanced_image,0.8);                                        % 转换为二值图像
figure
imshow(img_end)

五、形态学滤波

(一)开闭运算

  1. 打开image 文件夹中的图片,并进行展示
  2. 把图片中右边部分无效的边缘进行裁剪(用函数crop),以至于图片只包含打点孔洞和表面
  3. 把裁剪后的图片,运用rgb2gray 函数变成灰度图
  4. 遍历灰度图,选择合理的阈值进行图片二值化。其中,黑色孔洞的部分在二值化图片中设为前景(1),其余部分设置为背景(0)
  5. 创建圆形结构元素,并选择合理的半径,对二值化图进行 开运算和闭运算,并观察效果
  6. 使用4连通或者8连通 (函数bwconncomp), 计算开运算或者闭运算连通域的个数,并print 输出。 使用labelmatrix函数,对连通域进行可视化。
img=imread('image.png');
subplot(2,2,1);
imshow(img)

[m,n,k]=size(img);
image=img(:,1:4300,:);  % crop the image
subplot(2,2,2);
imshow(image)

img_gray=rgb2gray(image);
subplot(2,2,3);
imshow(img_gray);

[m,n]=size(img_gray);
bw=zeros(m,n);
 for j=1:n
     for i=1:m
         if (img_gray(i,j)>=35)
             bw(i,j)=0;
         else
             bw(i,j)=1;    
         end
      end
 end 

%bw=img_gray>40;
%subplot(2,2,4);
%imshow(bw)

se_1 = strel('disk',10);
open_image=imopen(bw,se_1);
close_image=imclose(bw,se_1);
figure
subplot(2,1,1);
imshow(open_image)
subplot(2,1,2);
imshow(close_image)

%calculate the number of regions
cc=bwconncomp(bw,8);
%visualize the labels
L = labelmatrix(cc);
figure,imshow(label2rgb(L,'jet','k','shuffle'));

(二)腐蚀膨胀

  1. 打开image 文件中的图片,并用imshow函数进行展示
  2. 创建常见的各种结构元素,如diamond, disk, octagon, line ,rectangle等
  3. 尝试使用创建好的结构元素,对原图进行腐蚀和膨胀操作,并观察不同的参数,对腐蚀膨胀结果的影响
img=imread('rice-bw.png');
subplot(1,3,1)
imshow(img)

% create the structure element 
    %SE = strel("diamond",r)
    %SE = strel("disk",r)
    %SE = strel("octagon",r)
    %SE = strel("line",len,deg)
    %SE = strel("rectangle",[m n])
    %SE = strel("square",w)
    
se_1 = strel('disk',5);
se_2 = strel("line",11,90)
se_3 = strel("square",2)

% erode the image 
erode_img=imerode(img,se_2)
subplot(1,3,2)
imshow(erode_img)

%dilate the image
dilate_img=imdilate(img,se_2)
subplot(1,3,3)
imshow(dilate_img)

(三)形态学滤波

  1. 载入image 文件夹中的二值化图片“bw_image.png”
  2. 选取合适的形态学操作,对图片中的内部孔洞进行填充(如下图中红色圈圈所示),并展示结果

  1. 选取合适的形态学操作, 将周边的噪声(较小的连通域)进行去除(如下图中红色圈圈所示),并展示结果

  1. 使用8-连通进行连通域个数的计算
img=imread('bw_image.png');
subplot(2,2,1)
imshow(img)

BW = imfill(img,"holes");
subplot(2,2,2)
imshow(BW)

se_1 = strel('disk',15);
open_image=imopen(BW,se_1);

subplot(2,2,3)
imshow(open_image)

L = bwlabel(BW)

六、边缘检测

  1. 载入image 文件夹中的图片,并进行展示
  2. 直接使用maltab 自带的edge 函数, 分别进行给予sobel, prewitt算子的边缘检测, 并对比其效果
  3. 直接使用maltab 自带的edge 函数,进行canny 边缘检测, 对比canny 检测相对于给予sobel, prewitt等的优势
  4. 采用霍夫变换, 进行直线检测, 并原图中画出检测出的直线(用用红色线条)
  5. 选取最长和次长的两条直线,并在原图中画出它们(用黄色线条)
clc;
clear;

img = imread('wood-dowels.tif');
[m,n]=size(img);

%图片展示
subplot(2,2,1);
imshow(img);

%edg算法
sobelBW = edge(img,'sobel',0.06);  %可以省去0.06,系统会默认。
subplot(2,2,2);
imshow(sobelBW);

prewittBW = edge(img,'prewitt',0.06);  %可以省去0.06,系统会默认。
subplot(2,2,3);
imshow(prewittBW);


cannyBW = edge(img,'canny',0.06);  %可以省去0.06,系统会默认。
subplot(2,2,4);
imshow(cannyBW);
figure;

%霍夫变换
[H,theta,rho] = hough(cannyBW);

P = houghpeaks(H,5,'threshold',ceil(0.3*max(H(:))));
x = theta(P(:,2));
y = rho(P(:,1));
plot(x,y,'s','color','black');

lines = houghlines(cannyBW,theta,rho,P,'FillGap',5,'MinLength',7);
imshow(img), hold on
max_len = 0;
min_len = 65535;
for k = 1:length(lines)
   xy = [lines(k).point1; lines(k).point2];
   plot(xy(:,1),xy(:,2),'LineWidth',2,'Color','red');

   % Plot beginnings and ends of lines
   %plot(xy(1,1),xy(1,2),'x','LineWidth',2,'Color','red');
   %plot(xy(2,1),xy(2,2),'x','LineWidth',2,'Color','red');

   % Determine the endpoints of the longest line segment
   len = norm(lines(k).point1 - lines(k).point2);
   if ( len > max_len)
      max_len = len;
      xy_long_max = xy;
   end
   if ( len < min_len)
      min_len = len;
      xy_long_min = xy;
   end
end
% highlight the longest line segment
plot(xy_long_max(:,1),xy_long_max(:,2),'LineWidth',2,'Color','yellow');
% highlight the shortest line segment
plot(xy_long_min(:,1),xy_long_min(:,2),'LineWidth',2,'Color','yellow');

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值