• 利用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

    rice.tif

    1. function U()
    2. clear;
    3. clc;
    4. Gray_correction()
    5. Gray_level_correction()
    6. Piecewise_linear_transformation()
    7. Image_smoothing()
    8. Image_Sharpening()
    9. end
    10. % 灰度修正函数,对pout.tif和tire.tif处理
    11. function Gray_correction()
    12. img_p = imread('pout.tif'); % 读取文件
    13. img_t = imread('tire.tif'); % 读取文件
    14. figure('Name','灰度修正'); % 开一个叫灰度修正的窗口
    15. % pout.tif
    16. subplot(2,5, 1);imshow(img_p);title('pout.tif原图'); % 显示原图
    17. subplot(2,5, 2);imhist(img_p);title('pout.tif直方图'); % 显示直方图
    18. max_p = double(max(img_p(:))); % 得到像素最大值
    19. min_p = double(min(img_p(:))); % 得到像素最小值
    20. subplot(2,5, 3);plot([min_p,max_p],[0,255]);
    21. axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
    22. img2_p = imadjust(img_p,[min_p/255,max_p/255],[]);
    23. subplot(2,5, 4);imhist(img2_p);title('pout.tif变换后直方图'); % 显示变换后直方图
    24. subplot(2,5, 5);imshow(img2_p);title('pout.tif变换后图像'); % 显示变换后图像
    25. % tire.tif
    26. subplot(2,5, 6);imshow(img_t);title('tire.tif原图'); % 显示原图
    27. subplot(2,5, 7);imhist(img_t);title('tire.tif直方图'); % 显示直方图
    28. m_t = double(median(img_t(:))); % 中位数
    29. k1 = 128/m_t; % 第一根线的k
    30. k2 = 128/(255 - m_t); % 第二根线的k
    31. subplot(2,5, 8);plot([0,m_t,255],[0,128,255]);
    32. axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
    33. img2_t = (img_t*k1).*uint8(img_t<=m_t)+(img_t*k2+(255*(1-k2))).*uint8(img_t>m_t);
    34. subplot(2,5, 9);imhist(img2_t);title('tire.tif变换后直方图'); %显示变换后直方图
    35. subplot(2,5,10);imshow(img2_t);title('tire.tif变换后图像'); %显示变换后图像
    36. end
    37. % 对pout.tif进行不均匀光照的校正
    38. function Gray_level_correction()
    39. img = imread('pout.tif'); % 读取文件
    40. % img = imread('rice.png'); % 读取文件
    41. figure('Name','不均匀光照的校正'); % 开一个叫不均匀光照的校正的窗口
    42. subplot(3,3,1);imshow(img);title('pout.tif原图'); % 显示原图
    43. subplot(3,3,4);imhist(img);title('pout.tif原图直方图'); % 显示直方图
    44. img_1 = blkproc(img,[32,32],'min(x(:))'); % 相当于滤波 大一点不会出现突兀的色块
    45. s = size(img_1);
    46. if(img_1(s(1),s(2))==0) % blkproc可能会出现黑边
    47. img_1 = img_1(1:s(1)-1,1:s(2)-1);
    48. end
    49. img_1 = imresize(img_1, size(img), 'bilinear'); % 双线性插值,插到原图大小
    50. subplot(3,3,2);imshow(img_1);title('pout.tif背景'); % 显示背景
    51. img_1 = imsubtract(img,img_1); % 图像减法
    52. subplot(3,3,3);imshow(img_1);title('pout.tif光照校正图像'); % 显示光照校正图像
    53. subplot(3,3,6);imhist(img_1);title('pout.tif校正直方图'); % 显示直方图
    54. max_1 = double(max(img_1(:))); % 得到像素最大值
    55. min_1 = double(min(img_1(:))); % 得到像素最小值
    56. subplot(3,3,5);plot([min_1,max_1],[0,255]);
    57. axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
    58. img_2 = imadjust(img_1,[min_1/255,max_1/255],[]);
    59. subplot(3,3,9);imhist(img_2);title('pout.tif变换后直方图'); % 显示变换后直方图
    60. subplot(3,3,7);imshow(img_2);title('pout.tif变换后图像'); % 显示变换后图像
    61. end
    62. % 三段线性变换增强 对couple.tif处理
    63. function Piecewise_linear_transformation()
    64. img = imread('couple.tif'); % 读取文件
    65. figure('Name','三段线性变换增强'); % 开一个叫三段线性变换增强的窗口
    66. subplot(2,3,1);imshow(img);title('couple.tif原图'); % 显示原图
    67. subplot(2,3,4);imhist(img);title('couple.tif原图直方图'); % 显示直方图
    68. len = numel(img); % 求一下矩阵的像素数
    69. len_3 = len/3; %1/3像素数
    70. pt = imhist(img); % 得到各个像素值的像素数
    71. c = 0; % 像素计数
    72. x_1 = 0; % 1/3
    73. x_2 = 0; % 2/3
    74. for i =[0:255]
    75. c = c+pt(i+1);
    76. if(c>len_3&&~x_1) % 到了1/3
    77. x_1=double(i); % x_1下当前的数值
    78. end
    79. if(c>len_3+len_3&&~x_2) % 到了2/3
    80. x_2=double(i); % x_2下当前的数值
    81. end
    82. end
    83. k1 = 85/(x_1-0);
    84. b1 = 85-k1*x_1;
    85. k2 = 85/(x_2-x_1);
    86. b2 = 170-k2*x_2;
    87. k3 = 85/(255-x_2);
    88. b3 = 255-k3*255;
    89. subplot(2,3,5);plot([0,x_1,x_2,255],[0,85,170,255]);
    90. axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
    91. img = double(img);
    92. img_1 = uint8(((img*k1+b1).*(img<=x_1)+(img*k2+b2).*((x_1<img)&(img<=x_2))+(img*k3+b3).*(x_2<img)));
    93. subplot(2,3,6);imhist(img_1);title('couple.tif变换后直方图'); % 显示变换后直方图
    94. subplot(2,3,3);imshow(img_1);title('couple.tif变换后图像'); % 显示变换后图像
    95. end
    96. % 图像平滑方法。测试图像为eight.tif
    97. function Image_smoothing()
    98. img = imread('eight.tif'); % 读取文件
    99. figure('Name','图像平滑'); % 开一个叫图像平滑的窗口
    100. subplot(2,4,1);imshow(img);title('eight.tif原图'); % 显示原图
    101. img_1 = imnoise(img,'poisson'); % 泊松噪声
    102. img_2 = imnoise(img,'salt & pepper'); % 椒盐噪声
    103. img_3 = imnoise(img,'gaussian'); % 高斯噪声
    104. subplot(2,4,2);imshow(img_1);title('泊松噪声'); % 显示泊松噪声图像
    105. subplot(2,4,3);imshow(img_2);title('椒盐噪声'); % 显示椒盐噪声图像
    106. subplot(2,4,4);imshow(img_3);title('高斯噪声'); % 显示高斯噪声图像
    107. h = 1/9.*[1 1 1;1 1 1;1 1 1];
    108. img_1 = filter2(h,img_1); % 均值滤波
    109. img_2 = medfilt2(img_2); % 中值滤波
    110. h = 1/16.*[1 2 1 ;2 4 2 ;1 2 1];
    111. img_3 = filter2(h,img_3); % 高斯滤波
    112. subplot(2,4,6);imshow(img_1,[]);title('泊松噪声-均值滤波'); % 显示泊松噪声处理后图像
    113. subplot(2,4,7);imshow(img_2,[]);title('椒盐噪声-中值滤波'); % 显示椒盐噪声处理后图像
    114. subplot(2,4,8);imshow(img_3,[]);title('高斯噪声-高斯滤波'); % 显示高斯噪声处理后图像
    115. end
    116. % 图像锐化方法。测试图像为rice.tif、cameraman.tif
    117. function Image_Sharpening()
    118. img_r = imread('rice.png'); % 读取文件
    119. img_c = imread('cameraman.tif'); % 读取文件
    120. figure('Name','图像锐化'); % 开一个叫图像锐化的窗口
    121. subplot(2,5,1);imshow(img_r);title('rice.tif原图'); % 显示原图
    122. subplot(2,5,6);imshow(img_c);title('cameraman.tif原图'); % 显示原图
    123. subplot(2,5,2);imshow(edge(img_r,'roberts',0.01));title('罗伯茨梯度-R-0.01');
    124. subplot(2,5,7);imshow(edge(img_c,'roberts',0.01));title('罗伯茨梯度-C-0.01');
    125. subplot(2,5,3);imshow(edge(img_r,'roberts',0.04));title('罗伯茨梯度-R-0.04');
    126. subplot(2,5,8);imshow(edge(img_c,'roberts',0.04));title('罗伯茨梯度-C-0.04');
    127. subplot(2,5,4);imshow(edge(img_r,'roberts',0.07));title('罗伯茨梯度-R-0.07');
    128. subplot(2,5,9);imshow(edge(img_c,'roberts',0.07));title('罗伯茨梯度-C-0.07');
    129. subplot(2,5,5);imshow(edge(img_r,'roberts',0.1 ));title('罗伯茨梯度-R-0.1');
    130. subplot(2,5,10);imshow(edge(img_c,'roberts',0.1));title('罗伯茨梯度-C-0.1');
    131. end

    结果如下:

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

     灰度修正:

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

    不均匀光照的校正:

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

    三段线性变换增强:

    1. % 三段线性变换增强 对couple.tif处理
    2. function Piecewise_linear_transformation()
    3. img = imread('couple.tif'); % 读取文件
    4. figure('Name','三段线性变换增强'); % 开一个叫三段线性变换增强的窗口
    5. subplot(2,3,1);imshow(img);title('couple.tif原图'); % 显示原图
    6. subplot(2,3,4);imhist(img);title('couple.tif原图直方图'); % 显示直方图
    7. len = numel(img); % 求一下矩阵的像素数
    8. len_3 = len/3; %1/3像素数
    9. pt = imhist(img); % 得到各个像素值的像素数
    10. c = 0; % 像素计数
    11. x_1 = 0; % 1/3
    12. x_2 = 0; % 2/3
    13. for i =[0:255]
    14. c = c+pt(i+1);
    15. if(c>len_3&&~x_1) % 到了1/3
    16. x_1=double(i); % x_1下当前的数值
    17. end
    18. if(c>len_3+len_3&&~x_2) % 到了2/3
    19. x_2=double(i); % x_2下当前的数值
    20. end
    21. end
    22. k1 = 85/(x_1-0);
    23. b1 = 85-k1*x_1;
    24. k2 = 85/(x_2-x_1);
    25. b2 = 170-k2*x_2;
    26. k3 = 85/(255-x_2);
    27. b3 = 255-k3*255;
    28. subplot(2,3,5);plot([0,x_1,x_2,255],[0,85,170,255]);
    29. axis([0 255 0 255]);title('线性变换函数'); %显示线性变换函数
    30. img = double(img);
    31. img_1 = uint8(((img*k1+b1).*(img<=x_1)+(img*k2+b2).*((x_1<img)&(img<=x_2))+(img*k3+b3).*(x_2<img)));
    32. subplot(2,3,6);imhist(img_1);title('couple.tif变换后直方图'); % 显示变换后直方图
    33. subplot(2,3,3);imshow(img_1);title('couple.tif变换后图像'); % 显示变换后图像
    34. end

    图像平滑方法:

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

    图像锐化方法:

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

  • 相关阅读:
    ChatGPT Prompting开发实战(五)
    外汇天眼:美国10年期国债收益率创下2011年以来新高
    Camera2相机拍照流程之预览功能梳理
    聚观早报 | 科学家颜宁宣布离美归国;亚马逊市值跌破1万亿美元;快手创作者版App正式上线
    高等数学,反常积分收敛
    JS基础练习2
    liunx安装docker
    使用mybatis plus自定义拦截器,实现数据权限
    智慧班级管理系统 java
    Spring之AOP的切点、通知、切点表达式以及知识要点
  • 原文地址:https://blog.csdn.net/weixin_58196051/article/details/127822223