@shaobaobaoer
2018-10-28T04:47:31.000000Z
字数 3350
阅读 2180
matlab
数字图像处理
************************************************************************
> File Name: 《数字图像处理》第二次作业 :MATLAB 彩色图像处理
> Author: 罗天涵
> Student-Id: 16121141
> Mail: luotianhan@126.com
************************************************************************
函数说明
Matlab中的cat函数是concatenate的缩写,本意是“连接”的意思。cat函数的使用方法可以在Matlab的help中查找。
函数用法
- cat(1,A,B)在竖直方向合并。两个矩阵想要在竖直方向上合并,也就必须列相同。
- cat(2,A,B)在水平方向合并。同样的道理,两个矩阵要在水平方向上合并.
- cat(3,A,B)合并为3维矩阵
- cat(N,A,B)合并为n维矩阵
函数样例
>> a
a =
1 2
3 4
>> b
b =
4 5
6 7
>> cat(1,a,b)
ans =
1 2
3 4
4 5
6 7
>> cat(2,a,b)
ans =
1 2 4 5
3 4 6 7
>> cat(3,a,b)
ans(:,:,1) =
1 2
3 4
ans(:,:,2) =
4 5
6 7
函数说明
一幅RGB图像就是M×N×3大小的彩色像素的数组,其中的每个彩色像素点都是在特定空间位置的彩色图像所对应的红、绿、蓝三个分量。RGB图像也可以看做由三个灰度图像形成的“堆栈”,当发送到彩色监视器的红、绿、蓝输入端时,就在屏幕上产生彩色图像。RGB彩色空间常常用RGB彩色立方体加以显示,如图6-2所示。这个立方体的顶点是光的原色(红、绿、蓝)和二次色(青色、紫红色、黄色)
rgbcube就是从任意一个角度去观察rgb彩色立方体。
函数用法
rgbcube不是matlab的自带函数,而是冈萨雷斯的教材自定义的一个函数。所幸教材提供了代码和示范。
% Blue-Magenta-White-Cyan ( 0, 0, 10) 蓝-洋红-白-青
% Red-Yellow-White-Magenta ( 10, 0, 0) 红-黄-白-洋红
% Green-Cyan-White-Yellow ( 0, 10, 0) 绿-青-白-黄
% Black-Red-Magenta-Blue ( 0, -10, 0) 黑-红-洋红-蓝
RGBCUBE(VX,VY,VZ)显示RGB颜色立方体,从点(VX,VY,VZ)查看。序列中的第一个颜色最接近视轴,其他颜色从该轴看,向右(或上方),然后顺时针移动。
函数样例
>> rgbcube(0,10,0);
>> rgbcube(0,0,10);
函数说明
MATLAB figure的colormap中默认共有64种不同的颜色,所以colorbar的范围只能是[ 1, 64])。所以矩阵中的数值范围也应该是[1, 64]。
函数用法
函数样例
函数说明
将 RGB 图像转换为索引图像
函数用法
函数样例
这里采用均匀量化抖动将彩色立方体转化为压缩图像,如图所示,颜色确实被压缩的比较厉害;我进行了下对比:
RGB = imread('Fig0602(b)(RGB_color_cube).tif');
[X,map] = rgb2ind(RGB,128);
imshow(X,map)
可以发现,4096的色彩和抖动现象明显好于64个色彩的。在后面还原回去的时候也可以看得出来
函数说明
将索引图像转化为灰度图像,将灰度图像转化为索引图像
函数用法
函数样例
I1 = imread('cameraman.tif');
[X1, map1] = gray2ind(I1, 16);
[X2, map2] = imread('trees.tif');
I2 = ind2gray(X2,map2);
figure;% 开一个新的图像区域
subplot(2, 2, 1); imshow(I1); title('raw image');
subplot(2, 2, 2); imshow(X1, map1); title('ind image with 16 colors');
subplot(2, 2, 4); imshow(I2); title('raw image');
subplot(2, 2, 3); imshow(X2, map2); title('gray image convert by raw image');
grid on;
尽管选择了16种颜色,但这16种颜色终究还是灰色。
「后来发现下面两个图片的标题写反了」 彩色图像转灰色图像,效果也是很好的。注意和rgb2gray的不同。rgb2gray的参数是三唯的矩阵。
函数说明
函数用法
函数样例
函数说明
函数用法
函数样例
函数说明
函数用法
函数样例
说实话,之前写过了中值滤波后,这次再写,就调用之前写的函数即可。有个很大的问题就是算法的效率比较低。
我的思路比较简单,分离RGB后把之前的函数调用一下,最后再拼回去,就是滤波后的rgb图像
函数代码
function [outputArg1] = median_filter_rgbimg(inputArg1,n,padding_mode)
% inputArg1 RGB img
R =inputArg1(:,:,1);
G=inputArg1(:,:,2);
B =inputArg1(:,:,3);
R = median_filter_plus(R,n,padding_mode);
G = median_filter_plus(G,n,padding_mode);
B = median_filter_plus(B,n,padding_mode);
outputArg1 = cat(3,R,G,B);
end
测试代码
% media_filter_rgbimg_test
I = imread('./imgs/maxresdefault.jpg');
M3 = median_filter_rgbimg(I,3,'zero');
M9 = median_filter_rgbimg(I,9,'zero');
M16 = median_filter_rgbimg(I,16,'zero');
figure;% 开一个新的图像区域
subplot(2, 2, 1); imshow(I); title('raw image');
subplot(2, 2, 2); imshow(M3); title('3*3 滤波模板 ');
subplot(2, 2, 3); imshow(M9); title('9*9 滤波模板');
subplot(2, 2, 4); imshow(M16); title('16*16 滤波模板');
grid on;
可以看到,在滤波的作用下,图像的字体变得逐渐模糊。
可以看到,在滤波的作用下,图像的内容变得逐渐模糊。