[关闭]
@shaobaobaoer 2018-10-28T04:47:31.000000Z 字数 3350 阅读 2180

《数字图像处理》第二次作业 :MATLAB 彩色图像处理

matlab 数字图像处理


************************************************************************
> File Name: 《数字图像处理》第二次作业 :MATLAB 彩色图像处理
> Author: 罗天涵
> Student-Id: 16121141
> Mail: luotianhan@126.com
************************************************************************

一. 熟悉matlab彩色图像处理函数

1.1 cat

函数说明
Matlab中的cat函数是concatenate的缩写,本意是“连接”的意思。cat函数的使用方法可以在Matlab的help中查找。

函数用法
- cat(1,A,B)在竖直方向合并。两个矩阵想要在竖直方向上合并,也就必须列相同。
- cat(2,A,B)在水平方向合并。同样的道理,两个矩阵要在水平方向上合并.
- cat(3,A,B)合并为3维矩阵
- cat(N,A,B)合并为n维矩阵

函数样例

  1. >> a
  2. a =
  3. 1 2
  4. 3 4
  5. >> b
  6. b =
  7. 4 5
  8. 6 7
  9. >> cat(1,a,b)
  10. ans =
  11. 1 2
  12. 3 4
  13. 4 5
  14. 6 7
  15. >> cat(2,a,b)
  16. ans =
  17. 1 2 4 5
  18. 3 4 6 7
  19. >> cat(3,a,b)
  20. ans(:,:,1) =
  21. 1 2
  22. 3 4
  23. ans(:,:,2) =
  24. 4 5
  25. 6 7

1.2 rgbcube

函数说明

一幅RGB图像就是M×N×3大小的彩色像素的数组,其中的每个彩色像素点都是在特定空间位置的彩色图像所对应的红、绿、蓝三个分量。RGB图像也可以看做由三个灰度图像形成的“堆栈”,当发送到彩色监视器的红、绿、蓝输入端时,就在屏幕上产生彩色图像。RGB彩色空间常常用RGB彩色立方体加以显示,如图6-2所示。这个立方体的顶点是光的原色(红、绿、蓝)和二次色(青色、紫红色、黄色)

rgbcube就是从任意一个角度去观察rgb彩色立方体。

函数用法
rgbcube不是matlab的自带函数,而是冈萨雷斯的教材自定义的一个函数。所幸教材提供了代码和示范。

  1. % Blue-Magenta-White-Cyan ( 0, 0, 10) 蓝-洋红-白-青
  2. % Red-Yellow-White-Magenta ( 10, 0, 0) 红-黄-白-洋红
  3. % Green-Cyan-White-Yellow ( 0, 10, 0) 绿-青-白-黄
  4. % Black-Red-Magenta-Blue ( 0, -10, 0) 黑-红-洋红-蓝

RGBCUBE(VX,VY,VZ)显示RGB颜色立方体,从点(VX,VY,VZ)查看。序列中的第一个颜色最接近视轴,其他颜色从该轴看,向右(或上方),然后顺时针移动。

函数样例

  1. >> rgbcube(0,10,0);

rhb_ube_0-10-0.png-2.6kB

  1. >> rgbcube(0,0,10);

rhbcube_0-0-10.png-2.6kB

1.3 colormap

函数说明
MATLAB figure的colormap中默认共有64种不同的颜色,所以colorbar的范围只能是[ 1, 64])。所以矩阵中的数值范围也应该是[1, 64]。

函数用法

函数样例

1.4 rgb2ind ind2rgb

函数说明
将 RGB 图像转换为索引图像

函数用法

函数样例

这里采用均匀量化抖动将彩色立方体转化为压缩图像,如图所示,颜色确实被压缩的比较厉害;我进行了下对比:

  1. RGB = imread('Fig0602(b)(RGB_color_cube).tif');
  2. [X,map] = rgb2ind(RGB,128);
  3. imshow(X,map)

rgb2ind_test1.png-59.4kB

可以发现,4096的色彩和抖动现象明显好于64个色彩的。在后面还原回去的时候也可以看得出来

ind2rgb_test.png-52.8kB

1.5 gray2nd ind2gray

函数说明
将索引图像转化为灰度图像,将灰度图像转化为索引图像

函数用法

函数样例

  1. I1 = imread('cameraman.tif');
  2. [X1, map1] = gray2ind(I1, 16);
  3. [X2, map2] = imread('trees.tif');
  4. I2 = ind2gray(X2,map2);
  5. figure;% 开一个新的图像区域
  6. subplot(2, 2, 1); imshow(I1); title('raw image');
  7. subplot(2, 2, 2); imshow(X1, map1); title('ind image with 16 colors');
  8. subplot(2, 2, 4); imshow(I2); title('raw image');
  9. subplot(2, 2, 3); imshow(X2, map2); title('gray image convert by raw image');
  10. grid on;

gray2ind_test.png-109.4kB

尽管选择了16种颜色,但这16种颜色终究还是灰色。
「后来发现下面两个图片的标题写反了」 彩色图像转灰色图像,效果也是很好的。注意和rgb2gray的不同。rgb2gray的参数是三唯的矩阵。

rgb2ntsc ntsc2rgb

函数说明

函数用法

函数样例

rgb2ycber ycbcr2rgb

函数说明

函数用法

函数样例

rgb2hsv hsv2rgb

函数说明

函数用法

函数样例

二. 彩色图像的中值滤波增强

说实话,之前写过了中值滤波后,这次再写,就调用之前写的函数即可。有个很大的问题就是算法的效率比较低。
我的思路比较简单,分离RGB后把之前的函数调用一下,最后再拼回去,就是滤波后的rgb图像

函数代码

  1. function [outputArg1] = median_filter_rgbimg(inputArg1,n,padding_mode)
  2. % inputArg1 RGB img
  3. R =inputArg1(:,:,1);
  4. G=inputArg1(:,:,2);
  5. B =inputArg1(:,:,3);
  6. R = median_filter_plus(R,n,padding_mode);
  7. G = median_filter_plus(G,n,padding_mode);
  8. B = median_filter_plus(B,n,padding_mode);
  9. outputArg1 = cat(3,R,G,B);
  10. end

测试代码

  1. % media_filter_rgbimg_test
  2. I = imread('./imgs/maxresdefault.jpg');
  3. M3 = median_filter_rgbimg(I,3,'zero');
  4. M9 = median_filter_rgbimg(I,9,'zero');
  5. M16 = median_filter_rgbimg(I,16,'zero');
  6. figure;% 开一个新的图像区域
  7. subplot(2, 2, 1); imshow(I); title('raw image');
  8. subplot(2, 2, 2); imshow(M3); title('3*3 滤波模板 ');
  9. subplot(2, 2, 3); imshow(M9); title('9*9 滤波模板');
  10. subplot(2, 2, 4); imshow(M16); title('16*16 滤波模板');
  11. grid on;

median_colorful_img.png-445.8kB
可以看到,在滤波的作用下,图像的字体变得逐渐模糊。

median_colorful_img2.png-187.4kB
可以看到,在滤波的作用下,图像的内容变得逐渐模糊。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注