Matlab学习日记之映像
映像
映像读取
I = imread('pout.tif'); 读取文件名为pout.tif的映像,并储存到变量I中
imshow(I); 显示该映像
imageinfo('pout.tif') 读取该映像的文件信息
imtool('pout.tif') 获取映像工具,可以读取每块像素点上的值(黑白映像为0和1,0代表黑色,1代表白色。灰度映像为0-255,值越大图像越白。
三色映像中的每个颜色也是0-255)
映像操作
I=imread('rice.png');
J=immultiply(I,1.5); 将I映像中的各像素点值乘1.5倍(使图像亮度提高)
I=imread('rice.png');J=imread('cameraman.tif');K=imadd(I,J); imadd(I,J)将映像I和映像J叠加在一起(两个映像的像素点的值也会叠加)
subplot(1,3,1);imshow(I);
subplot(1,3,2);imshow(J);
subplot(1,3,3);imshow(K);
imhist(I) 显示映像I像素值的分布直方图
I=imread('pout.tif');J=histeq(I); histeq(I)扩大映像I像素点值的分布
subplot(1,4,1);imhist(I);
subplot(1,4,2);imshow(I);
subplot(1,4,3);imhist(J);
subplot(1,4,4);imshow(J);
subplot(1,2,1);imshow(I);J=imrotate(I,35,'bilinear') 将映像I旋转35度存储到J中
subplot(1,2,2);imshow(J)
imwrite(I,'rice2.jpg') 将映像I以名字为rice2类型为JPG的格式写入当前文件夹中
灰度映像转为黑白映像
I=imread('rice.png');
level=graythresh(I); 获取映像I的灰度门限值(即区分黑于白的中间值)
bw=im2bw(I,level); 利用im2bw(I,level)将映像I按照门限值level来转换为黑白映像(即小于门限值的像素点全改写为0,大于门限值的像素点
改写为255,达到只剩黑白颜色的映像)
subplot(1,2,1);imshow(I);
subplot(1,2,2);imshow(bw);
%转换为黑白映像后会发现并不是十分的完美,有些像素点并没转换成功,仔细发现原来是因为原映像中存在亮度有差异导致的结果,
所以需要对原映像先做一个处理
BG=imopen(I,strel('disk',15)) 利用imopen()函数获取映像I的背景图
I2=imsubtract(I,BG); 将映像I的所有的像素点的值减去背景图像素点的值
subplot(1,3,1);imshow(I);
subplot(1,3,2);imshow(BG)
subplot(1,3,3);imshow(I2);
%这是就发现映像I2的亮度就比较均匀,再使用之前的方式对映像I2进行转为即可
level2=graythresh(I2);
bw2=im2bw(I2,level2)
subplot(1,2,1);imshow(bw);
subplot(1,2,2);imshow(bw2);
%计算‘rice.png’中米粒的个数
I=imread('rice.png');
BG=imopen(I,strel('disk',15))
I2=imsubtract(I,BG);
level2=graythresh(I2);
bw2=im2bw(I2,level2)
[labeled,numObjects]=bwlabel(BW,8);
将映像像素点组成的矩阵复制给labeled,依次扫描矩阵,若遇到的是米粒采用深度优先(个人猜测)的方法将该米粒所覆盖的像素点填充1。
继续扫矩阵遇到米粒描填充2,依次类推。扫描方式从上到下,从左到右。
%获取到了labeled对米粒的操作就更方便了
RGB_label=label2rgb(labeled);imshow(RGB_label); 将不同的米粒以不同颜色渲染
%获取映像中某一个米粒的信息(根据labeled中的索引来确定是第几个),信息包括:米粒的面积、中心坐标、对角边界坐标。
graindata=regionprops(labeled,'basic');
graindata(51) 显示对51个米粒的信息
学习资料源于:https://www.bilibili.com/video/BV1GJ41137UH