目录

一、实验意义及目的

二、实验内容

三、Matlab 相关函数介绍

四、算法原理

五、参考代码及扩展代码流程图 

(1)参考代码流程图

(2)扩展代码流程图

六、参考代码

七、实验要求

(1)对以上处理变换参数,查看处理效果;

(2)更改伪彩色增强方法为热金属编码或彩虹编码伪彩色处理

(3)设计不同的平滑滤波、锐化滤波方法,查看处理效果

(4)自行设计方法,实现对彩色图像增强处理。(Python、opencv实现)


一、实验意义及目的

1 )进一步掌握图像处理工具 Matlab ,熟悉基于 Matlab 的图像处理函数。
(2)掌握各种图像增强方法。

二、实验内容

打开一幅彩色图像 Image1 ,使用 Matlab 图像处理函数,对其进行下列变换:
1 )将 Image1 灰度化为 gray ,统计并显示其灰度直方图;
(2)对 gray 进行分段线性变换;
(3)对 gray 进行直方图均衡化;
(4)对 gray 进行伪彩色增强;
(5)对 gray 添加噪声并平滑;
(6)对 gray 利用 Sobel 算子锐化;
(7)实验要求中的拓展内容。

三、Matlab 相关函数介绍

1imhist 函数
  功能:统计变显示图像的直方图。
  调用格式:
  imhist(I) :显示图像 I 的直方图。
  imhist(I, n) :显示图像 I 的直方图, n 指定直方图中的列数。
  [COUNTS,X] = imhist(...) :返回直方图数据向量 COUNTS 和相应的色彩值向量 X
(2)histeq 函数
  功能:直方图均衡化
  调用格式:
  J = histeq(I,hgram) :将图像 I 的直方图变成用户指定的向量 hgram hgram 中的各元素值
  域为 [0,1]
  J = histeq(I,N) :对原始图像 I 进行直方图均衡化, N 为输出图像的灰度技术,默认 N
  64
(3)imadjust 函数
  功能:调整图像灰度值或颜色映射表,增加图像的对比度。
  调用格式: J = imadjust(I,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA) :调整图像     I   的灰度值;[LOW_IN; HIGH_IN] 指定原始图像中要变换的灰度范围; [LOW_OUT; HIGH_OUT]  指定变换后的灰度范围;低于 LOW_IN 、高于 HIGH_IN 的采取截取式;都可以使用空的矩阵 [],默认值是 [0 1] GAMMA 为标量,指定描述值 I 和值 J 关系的曲线形状,如果小于 1 ,此映射偏重更高数值(明亮)输出,如果 gamma 大于 1 ,此映射偏重更低数值(灰暗)输出如果省略此参数,默认为(线性映射)。 NEWMAP = imadjust(MAP,[LOW_IN; HIGH_IN],[LOW_OUT; HIGH_OUT],GAMMA):调整索引图像的颜色表 map ,其他参量同上。
RGB2 = imadjust(RGB1,...) :对 RGB 图像 RGB1 R G B 分量进行调整。
(4)imnoise 函数
  J = imnoise(I,type,parameters) :按指定类型在图像 I 上添加噪声; type 表示噪声类型,
  parameters 为其所对应参数,可取值如表 1 所示:
(5fspecial 函数
  h=fspecial(type,parameters) :创建指定类型和参数的二维滤波器 h ,如表 2 所示:

(6)filter2 函数
  Y = filter2(B,X,shape) :使用二维 FIR 滤波器 B 对矩阵 X 进行滤波; shape 指定返回值 Y
  的形式, ‘full’ Y 的维数大于 X ‘same’ Y 的维数等于 X ‘valid’ Y 的维数小于 X ;默认 为     same
(7)imfilter 函数
  B=imfilter(A,H,option1,option2,…) :根据指定的属性 option1 option2… 等,使用多维滤波
  器 H 对图像 A 进行滤波, H 常由函数 fspecial 输出得到。属性参数如表 3 所示:

(8)medfilt2 函数
 B = medfilt2(A,[m n]]) :用 [m n] 大小的滤波器对图像 A 进行中值滤波,输出图像为 B ,滤
 波器大小默认为 3×3
(9)edge 函数
  BW = edge(I) :对灰度或二值图像 I 进行边缘检测,检测后图像为二值图像 BW ,边界处
  取值为 1 ,否则为 0 。缺省情况下, edge 函数使用 Sobel 算子检测边缘,也可以指定算子。
  BW = edge(I,'sobel') BW = edge(I,'prewitt') BW = edge(I,'roberts')
  BW = edge(I,'log') BW = edge(I,'canny') 引号内为指定算子。
  BW = edge(I,'sobel',thresh) thresh 指定保留边缘的阈值,若为 0 edge 函数自动选择该值。

四、算法原理

  图像增强是一种基本的图像处理技术,主要是为了改善图像的质量以及增强感兴趣的部分,改善图像的视觉效果或者使图像变得更加有利于计算机处理。相关的图像增强技术有针对单个像素点的点运算,也有针对像素局部领域的模板运算,根据模板运算的具体功能还可以分为图像平滑、图像锐化等。

  灰度级变换就是借助于变换函数将输入的像素灰度值映射成一个新的输出值。直方图修正法的基本原理就是通过构造灰度级变换函数来改造原图像的直方图,使变换后的图像的直方图达到一定要求。而基于照度—反射模型的图像增强,通常将自然景象图像拆解成照明函数于反射函数的乘积。其算法原理,通常会借助于对数变换,将乘积转换为两个分量相加,设计函数,对高频与低频成分产生不同影响以达到图像增强效果。伪彩色增强则是一种灰度到彩色的映射技术,其目的是把灰度图像的不同灰度级按照线性或非线性映射成不同的颜色,以提高图像内容的可辨识度,达到增强的效。

  图像平滑,通常把抑制或者消除图像中存在的噪声而改善图像质量的过程称为土象的平滑。图像平滑方法大致分为两大类:空域法和频域法。空域法主要借助模板运算,在像素点领域内,利用噪声像素点特性进行滤波;频域法是指对图像进行正交变换,利用噪声对应高频信息的特点进行滤波。

  图像锐化,其目的在于加强图像中景物的边缘和轮廓,突出图像中的细节或增强被模糊了的细节。图像的边缘主要有三种类型:细线型、突变型、渐变型。通过分析边缘变化曲线 和其一二阶微分曲线,即可知边缘

五、参考代码及扩展代码流程图 

(1)参考代码流程图

(2)扩展代码流程图

六、参考代码

参考代码中实现了彩色图像的灰度化、灰度图像的直方图统计、分段线性变换、直方图
均衡化、伪彩色增强、添加噪声与中值滤波、 Sobel 算子滤波。
Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
imhist(gray); 
[h,w]=size(gray); 
NewImage1=zeros(h,w); 
a=80/256; b=180/256; c=30/256; d=220/256;
for x=1:w
 for y=1:h
 if gray(y,x)<a 
 NewImage1(y,x)=gray(y,x)*c/a;
 elseif gray(y,x)<b
 NewImage1(y,x)=(gray(y,x)-a)*(d-c)/(b-a)+c;
 else
 NewImage1(y,x)=(gray(y,x)-b)*(255-d)/(255-b)+d;
 end 
 end
end
figure,imshow(NewImage1),title('分段线性变换');
NewImage2=histeq(gray);
figure,imshow(NewImage2),title('直方图均衡化');
NewImage3=zeros(h,w,3);
for x=1:w
 for y=1:h
 if gray(y,x)<64/256
 NewImage3(y,x,1)=0;
 NewImage3(y,x,2)=4*gray(y,x);
 NewImage3(y,x,3)=1;
 elseif gray(y,x)<128/256
 NewImage3(y,x,1)=0;
 NewImage3(y,x,2)=1;
 NewImage3(y,x,3)=2-4*gray(y,x);
 elseif gray(y,x)<192/256
 NewImage3(y,x,1)=4*gray(y,x)-2;
 NewImage3(y,x,2)=1;
 NewImage3(y,x,3)=0;
 else
 NewImage3(y,x,1)=1;
 NewImage3(y,x,2)=4-4*gray(y,x);
 NewImage3(y,x,3)=0;
 end
 end
end
figure,imshow(NewImage3);
 
noiseIsp=imnoise(gray,'salt & pepper',0.1); 
noiseIg=imnoise(gray,'gaussian'); 
result1=medfilt2(noiseIsp); 
result2=medfilt2(noiseIg);
figure;
subplot(121),imshow(result1),title('椒盐噪声3×3中值滤波');
subplot(122),imshow(result2),title('高斯噪声3×3中值滤波');
H1=[-1 -2 -1;0 0 0;1 2 1]; 
H2=[-1 0 1;-2 0 2;-1 0 1]; 
R1=imfilter(gray,H1); 
R2=imfilter(gray,H2);
edgeImage=abs(R1)+abs(R2); 
sharpImage=gray+edgeImage; 
figure;
subplot(121),imshow(edgeImage),title('Sobel梯度图像'); 
subplot(122),imshow(sharpImage),title('Sobel锐化图像');
程序的运行效果如下:

 

七、实验要求

1. 熟悉 Matlab 函数,读懂参考代码;
2. 拓展内容:

1)对以上处理变换参数,查看处理效果;

(2)更改伪彩色增强方法为热金属编码或彩虹编码

伪彩色处理

伪彩色增强:把一幅黑白域图像的不同灰度级映射为一幅彩色图像的技术手段。

伪彩色增强有很多种方法,而下面的增强方法则是使用的空间域灰度级-彩色变换法。

空间域灰度级-彩色变换法:可以将灰度图像变为具有多种颜色渐变的连续彩色图像,变换后的图像视觉效果较好,主要色相是将灰度图像f(x,y)送入具有不同变换性质的红、绿、蓝3个变换器,相对应的产生3个不同的输入fR(x,y),fG(x,y),fB(x,y)将它们对应地作为彩色图像的红绿蓝三个色彩分量合成一副彩色图像。

彩虹编码和热金属编码是其中的两种变化函数。

热金属编码

Image1=imread('lotus.bmp');
    
%转换为灰度
gray=rgb2gray(Image1);
[h,w]=size(gray);
%新图像的矩阵
NewImage4=zeros(h,w,3);
for x=1:h
    for y=1:w
        if gray(x,y)<64
        NewImage4(x,y,1)=0;
        elseif gray(x,y)<128
        NewImage4(x,y,1)=255*(gray(x,y)-64)/64;
        else
        NewImage4(x,y,1)=255;
        end
    end
end
for x=1:h
    for y=1:w
        if gray(x,y)<128
        NewImage4(x,y,2)=0;
        elseif gray(x,y)<192
        NewImage4(x,y,2)=255*(gray(x,y)-128)/64;
        else
        NewImage4(x,y,2)=255;
        end
    end
end
for x=1:h
    for y=1:w
        if gray(x,y)<64
        NewImage4(x,y,3)=255*gray(x,y)/64;
        elseif gray(x,y)<96
        NewImage4(x,y,3)=255;
        elseif gray(x,y)<128
        NewImage4(x,y,3)=255*(128-gray(x,y))/32;
        elseif gray(x,y)<192 
        NewImage4(x,y,3)=0;
        else
        NewImage4(x,y,3)=255*(gray(x,y)-192)/64;
        end
    end
end
imshow(NewImage4),title('热金属编码')

  彩虹编码

Image1=imread('lotus.bmp');
    
%转换为灰度
gray=rgb2gray(Image1);
[h,w]=size(gray);
%新图像的矩阵
NewImage3=zeros(h,w,3);
for x=1:h
    for y=1:w
        if gray(x,y)<96
        NewImage3(x,y,1)=0;
        elseif gray(x,y)<128
        NewImage3(x,y,1)=255*(gray(x,y)-96)/32;
        else
        NewImage3(x,y,1)=255;
        end
    end
end
for x=1:h
    for y=1:w
        if gray(x,y)<32
        NewImage3(x,y,2)=0;
        elseif gray(x,y)<64
        NewImage3(x,y,2)=255*(gray(x,y)-32)/32;
        elseif gray(x,y)<128
        NewImage3(x,y,2)=255;
        elseif gray(x,y)<192
        NewImage3(x,y,2)=255*(192-gray(x,y))/64;
        else
        NewImage3(x,y,2)=255*(gray(x,y)-192)/64;
        end
    end
end
for x=1:h
    for y=1:w
        if gray(x,y)<32
        NewImage3(x,y,3)=255*gray(x,y)/32;
        elseif gray(x,y)<64
        NewImage3(x,y,3)=255;
        elseif gray(x,y)<96
        NewImage3(x,y,3)=255*(96-gray(x,y))/32;
        elseif gray(x,y)<192 
        NewImage3(x,y,3)=0;
        else
        NewImage3(x,y,3)=255*(gray(x,y)-192)/64;
        end
    end
end
imshow(NewImage3),title('彩虹编码')

(3)设计不同的平滑滤波、锐化滤波方法,查看处理效果

    1.平滑滤波:

Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1); 
noisegaus=imnoise(gray,'gaussian'); %高斯噪声 
figure; 
subplot(121),imshow(gray),title('原图'); 
subplot(122),imshow(noisegaus),title('高斯噪声图'); 
result1=filter2(fspecial('average',3),noisegaus); 
figure; 
imshow(result1),title('3*3 均值滤波');
gausFilter=fspecial('gaussian',[2*3+1 2*3+1],0.6); 
result2 = imfilter(noisegaus,gausFilter,'conv'); 
figure; 
imshow(result2),title('sigmal=0.6 高斯滤波') 
result3 = medfilt2(noisegaus); 
figure; 
imshow(result3),title('3*3 中值滤波'); 
 
image2 = imread('lotus.bmp'); 
image2 = imnoise(image2,'gaussian'); 
Fimage = fftshift(fft2(double(image2))); 
[N M] = size(Fimage); 
g = zeros(N,M); 
r1 = floor(M/2); r2=floor(N/2); 
d0 = [5 11 45 68]; 
for i = 1:4 
    for x = 1:M 
        for y = 1:N 
            d = sqrt((x-r1)^2+(y-r2)^2); 
            if d<=d0(i) 
                h=1; 
            else
                h=0;
            end
            g(y,x) = h*Fimage(y,x); 
        end
    end
    g = real(ifft2(ifftshift(g))); 
    figure,imshow(uint8(g)),title(['理想低通滤波 D0=',num2str(d0(i))]); 
end

运行结果:

2.锐化滤波

Image1=im2double(imread('lotus.bmp'));
gray=rgb2gray(Image1);
H1=[-1 -2 -1;0 0 0;1 2 1];
H2=[-1 0 1;-2 0 2;-1 0 1];
R1=imfilter(gray,H1);
R2=imfilter(gray,H2);
edgeImage=abs(R1)+abs(R2); 
sharpImage=gray+edgeImage; 
figure; 
subplot(121),imshow(edgeImage),title('Sobel 梯度图像'); 
subplot(122),imshow(sharpImage),title('Sobel 锐化图像 ');
H1=[1 0;0 -1]; H2=[0 1;-1 0]; R1=imfilter(gray,H1); 
R2=imfilter(gray,H2); edgeImage=abs(R1)+abs(R2);
sharpImage=gray+edgeImage; 
figure; subplot(121),imshow(edgeImage),title('Roberts 梯度图像 '); 
subplot(122),imshow(sharpImage),title('Roberts 锐化图像 ');
H1=[-1 -1 -1;0 0 0;1 1 1];
H2=[-1 0 1;-1 0 1;-1 0 1]; 
R1=imfilter(gray,H1); 
R2=imfilter(gray,H2); 
edgeImage=abs(R1)+abs(R2); 
sharpImage=gray+edgeImage; 
figure; 
subplot(121),imshow(edgeImage),title('Prewitt 梯度图像 '); 
subplot(122),imshow(sharpImage),title('Prewitt 锐化图像 ');
H = fspecial('laplacian',0);
R = imfilter(gray,H); 
edgeImage = abs(R); 
H1 = [0 -1 0;-1 5 -1;0 -1 0]; 
sharpImage = imfilter(gray,H1);
figure;
subplot(121),imshow(edgeImage),title('Laplacian 滤波图 像'); 
subplot(122),imshow(sharpImage),title('Laplacian锐化图 像');
BW = edge(gray,'log'); 
H = fspecial('log',7,1); 
R = imfilter(gray,H); 
edgeImage = abs(R); 
sharpImage = gray+edgeImage; 
figure;
subplot(131),imshow(BW),title('LOG 边缘检测图像'); 
subplot(132),imshow(edgeImage),title('LOG 梯度图像'); 
subplot(133),imshow(sharpImage),title('LOG 锐化图像');
BW = edge(gray,'canny');
figure; 
imshow(BW),title('Canny 边缘检测');

运行结果:

 Sobel 算子效果图

 Roberts 算子效果图 Prewitt 算子效果图 

  Laplacian 算子效果图

 LOG 算子效果图

 Canny 算子效果图

(4)自行设计方法,实现对彩色图像增强处理。(Python、opencv实现)

import matplotlib.pyplot as plt
import cv2 as cv
import numpy as np

# 显示汉字用
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False


# 定义坐标数字字体和大小
def label_def():
    plt.rcParams['font.sans-serif'] = ['SimHei']
    plt.rcParams['axes.unicode_minus'] = False


if __name__ == '__main__':
    # 读取图片
    img_orig = cv.imread('lotus.bmp', 1)  # 读取彩色图片
    # 伽马变换处理
    img_gama = np.power(img_orig.astype(np.float32), 1.5)  # 图像较亮,若采用幂率变换,y>1,压缩高灰度级
    temp1 = img_gama - np.min(img_gama)
    img_gama = temp1 / np.max(temp1)
    # 显示所用的变换函数
    x1 = np.linspace(img_orig.min(), img_orig.max(), num=200)
    y1 = np.power(x1, 1.5)  # 伽马函数

    plt.subplot(221), plt.title('原图像'), plt.imshow(cv.cvtColor(img_orig, cv.COLOR_BGR2RGB)), plt.axis('off')
    plt.subplot(223), plt.title('伽马变换'), plt.imshow(cv.cvtColor(img_gama, cv.COLOR_BGR2RGB)), plt.axis('off')
    plt.subplot(224), plt.title('s=r**(1.5)'), plt.plot(x1, y1), plt.grid, label_def()
    plt.show()

运行结果:

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐