利用Matlab进行图像的增强

本文章包含以下内容:

1.图像灰度修正。测试图像pout.tif、tire.tif。读入灰度级分布不协调的图像,分析其直方图。根据直方图设计灰度变换表达式,调整表达式的参数,直到显示图像的直方图均衡为止。

2.不均匀光照的校正。测试图像pout.tif,采用分块处理函数blkproc和图像相减函数imsubtract对图像不均匀光照进行校正;

3、三段线性变换增强。测试图像couple.tif。选择合适的转折点,编程对图像进行三段线性变换增强。

4、图像平滑方法。测试图像为eight.tif。对测试图像人为加噪后进行平滑处理。根据噪声的不同,选择不同的去噪方法。

5、图像锐化方法。测试图像为rice.tif、cameraman.tif。读入一副边缘模糊的图像,利用罗伯茨梯度对图像进行4种锐化处理,比较各自的效果。

(灰度修正、不均匀光照的校正、三段线性变换增强、图像平滑方法、图像锐化方法)


目录:

目录

本文章包含以下内容:

目录:

全部代码如下:

结果如下:

下面这些是代码里的各个部分,方便复制 

 灰度修正:

不均匀光照的校正:

三段线性变换增强:

图像平滑方法:

图像锐化方法:


全部代码如下:

可以放到同一个文件里,如果缺少图片,在这里有:(记着改后缀)

couple.tif

利用Matlab进行图像的增强_第1张图片

rice.tif

利用Matlab进行图像的增强_第2张图片

function U()
    clear;
    clc;
    Gray_correction()
    Gray_level_correction()
    Piecewise_linear_transformation()
    Image_smoothing()
    Image_Sharpening()
end

% 灰度修正函数,对pout.tif和tire.tif处理
function Gray_correction()
    img_p = imread('pout.tif');  % 读取文件
    img_t = imread('tire.tif');  % 读取文件
    figure('Name','灰度修正');  % 开一个叫灰度修正的窗口
    % pout.tif
    subplot(2,5, 1);imshow(img_p);title('pout.tif原图');   % 显示原图
    subplot(2,5, 2);imhist(img_p);title('pout.tif直方图');   % 显示直方图
    max_p = double(max(img_p(:)));    % 得到像素最大值
    min_p = double(min(img_p(:)));    % 得到像素最小值
    subplot(2,5, 3);plot([min_p,max_p],[0,255]);
    axis([0 255 0 255]);title('线性变换函数');   %显示线性变换函数
    img2_p = imadjust(img_p,[min_p/255,max_p/255],[]);
    subplot(2,5, 4);imhist(img2_p);title('pout.tif变换后直方图');   % 显示变换后直方图
    subplot(2,5, 5);imshow(img2_p);title('pout.tif变换后图像');   % 显示变换后图像
    % tire.tif
    subplot(2,5, 6);imshow(img_t);title('tire.tif原图');   % 显示原图
    subplot(2,5, 7);imhist(img_t);title('tire.tif直方图');   % 显示直方图
    m_t = double(median(img_t(:)));    % 中位数
    k1 = 128/m_t;   % 第一根线的k
    k2 = 128/(255 - m_t);   % 第二根线的k
    subplot(2,5, 8);plot([0,m_t,255],[0,128,255]);
    axis([0 255 0 255]);title('线性变换函数');   %显示线性变换函数
    img2_t = (img_t*k1).*uint8(img_t<=m_t)+(img_t*k2+(255*(1-k2))).*uint8(img_t>m_t);
    subplot(2,5, 9);imhist(img2_t);title('tire.tif变换后直方图');   %显示变换后直方图
    subplot(2,5,10);imshow(img2_t);title('tire.tif变换后图像');   %显示变换后图像
end

% 对pout.tif进行不均匀光照的校正
function Gray_level_correction()
    img = imread('pout.tif');  % 读取文件
%     img = imread('rice.png');  % 读取文件
    figure('Name','不均匀光照的校正');  % 开一个叫不均匀光照的校正的窗口
    subplot(3,3,1);imshow(img);title('pout.tif原图');   % 显示原图
    subplot(3,3,4);imhist(img);title('pout.tif原图直方图');   % 显示直方图
    img_1 = blkproc(img,[32,32],'min(x(:))');             % 相当于滤波 大一点不会出现突兀的色块
    s = size(img_1);
    if(img_1(s(1),s(2))==0) % blkproc可能会出现黑边
        img_1 = img_1(1:s(1)-1,1:s(2)-1);
    end
    img_1 = imresize(img_1, size(img), 'bilinear');       % 双线性插值,插到原图大小
    subplot(3,3,2);imshow(img_1);title('pout.tif背景');   % 显示背景
    img_1 = imsubtract(img,img_1);  % 图像减法
    subplot(3,3,3);imshow(img_1);title('pout.tif光照校正图像');   % 显示光照校正图像
    subplot(3,3,6);imhist(img_1);title('pout.tif校正直方图');   % 显示直方图
    max_1 = double(max(img_1(:)));    % 得到像素最大值
    min_1 = double(min(img_1(:)));    % 得到像素最小值
    subplot(3,3,5);plot([min_1,max_1],[0,255]);
    axis([0 255 0 255]);title('线性变换函数');   %显示线性变换函数
    img_2 = imadjust(img_1,[min_1/255,max_1/255],[]);
    subplot(3,3,9);imhist(img_2);title('pout.tif变换后直方图');   % 显示变换后直方图
    subplot(3,3,7);imshow(img_2);title('pout.tif变换后图像');   % 显示变换后图像
end

% 三段线性变换增强 对couple.tif处理
function Piecewise_linear_transformation()
    img = imread('couple.tif');  % 读取文件
    figure('Name','三段线性变换增强');  % 开一个叫三段线性变换增强的窗口
    subplot(2,3,1);imshow(img);title('couple.tif原图');   % 显示原图
    subplot(2,3,4);imhist(img);title('couple.tif原图直方图');   % 显示直方图
    len = numel(img);  % 求一下矩阵的像素数
    len_3 = len/3;  % 求1/3像素数
    pt = imhist(img); % 得到各个像素值的像素数
    c = 0;  % 像素计数
    x_1 = 0;    % 1/3处
    x_2 = 0;    % 2/3处
    for i =[0:255]
        c = c+pt(i+1);
        if(c>len_3&&~x_1) % 到了1/3处
            x_1=double(i); % x_1下当前的数值
        end
        if(c>len_3+len_3&&~x_2) % 到了2/3处
            x_2=double(i); % x_2下当前的数值
        end
    end
    k1 = 85/(x_1-0);
    b1 = 85-k1*x_1;
    k2 = 85/(x_2-x_1);
    b2 = 170-k2*x_2;
    k3 = 85/(255-x_2);
    b3 = 255-k3*255;
    subplot(2,3,5);plot([0,x_1,x_2,255],[0,85,170,255]);
    axis([0 255 0 255]);title('线性变换函数');   %显示线性变换函数
    img = double(img);
    img_1 = uint8(((img*k1+b1).*(img<=x_1)+(img*k2+b2).*((x_1

结果如下:

利用Matlab进行图像的增强_第3张图片

利用Matlab进行图像的增强_第4张图片

利用Matlab进行图像的增强_第5张图片

利用Matlab进行图像的增强_第6张图片

利用Matlab进行图像的增强_第7张图片

下面这些是代码里的各个部分,方便复制 

 灰度修正:

% 灰度修正函数,对pout.tif和tire.tif处理
function Gray_correction()
    img_p = imread('pout.tif');  % 读取文件
    img_t = imread('tire.tif');  % 读取文件
    figure('Name','灰度修正');  % 开一个叫灰度修正的窗口
    % pout.tif
    subplot(2,5, 1);imshow(img_p);title('pout.tif原图');   % 显示原图
    subplot(2,5, 2);imhist(img_p);title('pout.tif直方图');   % 显示直方图
    max_p = double(max(img_p(:)));    % 得到像素最大值
    min_p = double(min(img_p(:)));    % 得到像素最小值
    subplot(2,5, 3);plot([min_p,max_p],[0,255]);
    axis([0 255 0 255]);title('线性变换函数');   %显示线性变换函数
    img2_p = imadjust(img_p,[min_p/255,max_p/255],[]);
    subplot(2,5, 4);imhist(img2_p);title('pout.tif变换后直方图');   % 显示变换后直方图
    subplot(2,5, 5);imshow(img2_p);title('pout.tif变换后图像');   % 显示变换后图像
    % tire.tif
    subplot(2,5, 6);imshow(img_t);title('tire.tif原图');   % 显示原图
    subplot(2,5, 7);imhist(img_t);title('tire.tif直方图');   % 显示直方图
    m_t = double(median(img_t(:)));    % 中位数
    k1 = 128/m_t;   % 第一根线的k
    k2 = 128/(255 - m_t);   % 第二根线的k
    subplot(2,5, 8);plot([0,m_t,255],[0,128,255]);
    axis([0 255 0 255]);title('线性变换函数');   %显示线性变换函数
    img2_t = (img_t*k1).*uint8(img_t<=m_t)+(img_t*k2+(255*(1-k2))).*uint8(img_t>m_t);
    subplot(2,5, 9);imhist(img2_t);title('tire.tif变换后直方图');   %显示变换后直方图
    subplot(2,5,10);imshow(img2_t);title('tire.tif变换后图像');   %显示变换后图像
end

不均匀光照的校正:

% 对pout.tif进行不均匀光照的校正
function Gray_level_correction()
    img = imread('pout.tif');  % 读取文件
%     img = imread('rice.png');  % 读取文件
    figure('Name','不均匀光照的校正');  % 开一个叫不均匀光照的校正的窗口
    subplot(3,3,1);imshow(img);title('pout.tif原图');   % 显示原图
    subplot(3,3,4);imhist(img);title('pout.tif原图直方图');   % 显示直方图
    img_1 = blkproc(img,[32,32],'min(x(:))');             % 相当于滤波 大一点不会出现突兀的色块
    s = size(img_1);
    if(img_1(s(1),s(2))==0) % blkproc可能会出现黑边
        img_1 = img_1(1:s(1)-1,1:s(2)-1);
    end
    img_1 = imresize(img_1, size(img), 'bilinear');       % 双线性插值,插到原图大小
    subplot(3,3,2);imshow(img_1);title('pout.tif背景');   % 显示背景
    img_1 = imsubtract(img,img_1);  % 图像减法
    subplot(3,3,3);imshow(img_1);title('pout.tif光照校正图像');   % 显示光照校正图像
    subplot(3,3,6);imhist(img_1);title('pout.tif校正直方图');   % 显示直方图
    max_1 = double(max(img_1(:)));    % 得到像素最大值
    min_1 = double(min(img_1(:)));    % 得到像素最小值
    subplot(3,3,5);plot([min_1,max_1],[0,255]);
    axis([0 255 0 255]);title('线性变换函数');   %显示线性变换函数
    img_2 = imadjust(img_1,[min_1/255,max_1/255],[]);
    subplot(3,3,9);imhist(img_2);title('pout.tif变换后直方图');   % 显示变换后直方图
    subplot(3,3,7);imshow(img_2);title('pout.tif变换后图像');   % 显示变换后图像
end

三段线性变换增强:

% 三段线性变换增强 对couple.tif处理
function Piecewise_linear_transformation()
    img = imread('couple.tif');  % 读取文件
    figure('Name','三段线性变换增强');  % 开一个叫三段线性变换增强的窗口
    subplot(2,3,1);imshow(img);title('couple.tif原图');   % 显示原图
    subplot(2,3,4);imhist(img);title('couple.tif原图直方图');   % 显示直方图
    len = numel(img);  % 求一下矩阵的像素数
    len_3 = len/3;  % 求1/3像素数
    pt = imhist(img); % 得到各个像素值的像素数
    c = 0;  % 像素计数
    x_1 = 0;    % 1/3处
    x_2 = 0;    % 2/3处
    for i =[0:255]
        c = c+pt(i+1);
        if(c>len_3&&~x_1) % 到了1/3处
            x_1=double(i); % x_1下当前的数值
        end
        if(c>len_3+len_3&&~x_2) % 到了2/3处
            x_2=double(i); % x_2下当前的数值
        end
    end
    k1 = 85/(x_1-0);
    b1 = 85-k1*x_1;
    k2 = 85/(x_2-x_1);
    b2 = 170-k2*x_2;
    k3 = 85/(255-x_2);
    b3 = 255-k3*255;
    subplot(2,3,5);plot([0,x_1,x_2,255],[0,85,170,255]);
    axis([0 255 0 255]);title('线性变换函数');   %显示线性变换函数
    img = double(img);
    img_1 = uint8(((img*k1+b1).*(img<=x_1)+(img*k2+b2).*((x_1

图像平滑方法:

% 图像平滑方法。测试图像为eight.tif
function Image_smoothing()
    img = imread('eight.tif');  % 读取文件
    figure('Name','图像平滑');  % 开一个叫图像平滑的窗口
    subplot(2,4,1);imshow(img);title('eight.tif原图');   % 显示原图
    img_1 = imnoise(img,'poisson');         % 泊松噪声
    img_2 = imnoise(img,'salt & pepper');   % 椒盐噪声
    img_3 = imnoise(img,'gaussian');        % 高斯噪声
    subplot(2,4,2);imshow(img_1);title('泊松噪声');   % 显示泊松噪声图像
    subplot(2,4,3);imshow(img_2);title('椒盐噪声');   % 显示椒盐噪声图像
    subplot(2,4,4);imshow(img_3);title('高斯噪声');   % 显示高斯噪声图像
    h = 1/9.*[1 1 1;1 1 1;1 1 1];
    img_1 = filter2(h,img_1);   % 均值滤波
    img_2 = medfilt2(img_2);    % 中值滤波
    h = 1/16.*[1 2 1 ;2 4 2 ;1 2 1];
    img_3 = filter2(h,img_3);   % 高斯滤波
    subplot(2,4,6);imshow(img_1,[]);title('泊松噪声-均值滤波');   % 显示泊松噪声处理后图像
    subplot(2,4,7);imshow(img_2,[]);title('椒盐噪声-中值滤波');   % 显示椒盐噪声处理后图像
    subplot(2,4,8);imshow(img_3,[]);title('高斯噪声-高斯滤波');   % 显示高斯噪声处理后图像
end

图像锐化方法:

% 图像锐化方法。测试图像为rice.tif、cameraman.tif
function Image_Sharpening()
    img_r = imread('rice.png');  % 读取文件
    img_c = imread('cameraman.tif');  % 读取文件
    figure('Name','图像锐化');  % 开一个叫图像锐化的窗口
    subplot(2,5,1);imshow(img_r);title('rice.tif原图');   % 显示原图
    subplot(2,5,6);imshow(img_c);title('cameraman.tif原图');   % 显示原图
    subplot(2,5,2);imshow(edge(img_r,'roberts',0.01));title('罗伯茨梯度-R-0.01');
    subplot(2,5,7);imshow(edge(img_c,'roberts',0.01));title('罗伯茨梯度-C-0.01');
    subplot(2,5,3);imshow(edge(img_r,'roberts',0.04));title('罗伯茨梯度-R-0.04');
    subplot(2,5,8);imshow(edge(img_c,'roberts',0.04));title('罗伯茨梯度-C-0.04');
    subplot(2,5,4);imshow(edge(img_r,'roberts',0.07));title('罗伯茨梯度-R-0.07');
    subplot(2,5,9);imshow(edge(img_c,'roberts',0.07));title('罗伯茨梯度-C-0.07');
    subplot(2,5,5);imshow(edge(img_r,'roberts',0.1 ));title('罗伯茨梯度-R-0.1');
    subplot(2,5,10);imshow(edge(img_c,'roberts',0.1));title('罗伯茨梯度-C-0.1');
end

你可能感兴趣的:(matlab,计算机视觉,开发语言)