2016-01-27 17:15:36 u014488388 阅读数 3119

1. 腐蚀  imerode( ' 目标图像 ‘ ,  strel () ) ;   // strel 的说明见 日志:matlab二值图像腐蚀

2. 膨胀  imdilate( ' 目标图像 ‘ ,  strel () ) ;

3.  开运算  imopen( ' 目标图像 ‘ ,  strel () ) ;  // 先腐蚀后膨胀

4.  闭运算  imclose( ' 目标图像 ‘ ,  strel () ) ; 

5.  击中不击中  bwhitmiss( ' 目标图像 ’ , 第一次腐蚀所用结构 , 第二次腐蚀所用图结构 )

      第一次腐蚀结构 : 背景黑,物体白

      第二次腐蚀结构 : 背景白,物体黑。  第一次结构的补集(以上说明是用同一物体判断击中与否)

6.  边界提取  本质还是腐蚀,腐蚀结构 可以选   strel( ' square ' , 3 )

7.  边界跟踪

8.  区域填充

9.  连通分量的提取   计数  [ L , 连通域的数目 ] = bwlabel( Ibw , 8 )  8连通或者4连通,默认8  


10.  细化算法

11.  像素化算法    将连通区域变成几何中心的一个像素

12.  凸壳处理    弥补凹陷

13.  bwmorph(图像,operation,执行次数)  可以执行多种操作,由operation决定。详见help

bridge 桥接

clear 清除孤立的前景像素

diag 围绕对角线相连的像素进行填充

fill 填充单个像素的孔洞

hbreak 去掉前景中的H形连接

majority P点的8邻域中的前景像素数量超过一半,则P点为前景

remove 去除内部像素

shrink 图像收缩为一点或者带洞的圆环

skel 骨骼化图像(细化算法)

squr 去除毛刺

thicken 粗化物体

thin 细化至最低限度相连的线形






2019-11-18 13:15:08 ncepu_Chen 阅读数 123

学习一门技术最好的方式就是阅读官方文档,可以查看MATLAB官方文档

图像的读取和展示

图像在MATLAB中的存储格式

MATLAB能够处理的数字图像分为三种:二值图像,灰度图像,彩色图像.

在这里插入图片描述

  • 二值图像在MATLAB中以一个矩阵存储,矩阵中元素的取值为0(表示白)或1(表示黑).

    在这里插入图片描述

  • 灰度图像在MATLAB中以一个矩阵存储,矩阵中元素的取值介于0~255之间,表示灰度.

    在这里插入图片描述

  • 彩色图像在MATLAB中以三个矩阵存储,每个矩阵中元素的取值介于0~255之间,分别表示颜色R,G,B分量的浓度

    在这里插入图片描述

读取和展示图像

使用imread()函数将图像读取到内存中,使用imshow()函数展示图像,使用imwrite()函数将内存中的图像写进硬盘.

clear, close all
I = imread('pout.tif'); 	% 将MATLAB自带图像'pout.tif'读取到内存中
imshow(I); 					% 在图形窗口展示该图像 
imwrite(I,'myimage.png');	% 将该图像存为png格式的文件

在这里插入图片描述

使用imageinfo()函数查看图片文件的详细信息.

imageinfo('pout.tif')

在这里插入图片描述

使用imtool()函数可以打开图像处理工具.

 imtool('pout.tif')

在这里插入图片描述

图像的运算

图像的点运算

图像在内存中以矩阵的形式存储,因此我们可以像遍历矩阵那样遍历并编辑图片上的像素点.MATLAB也内置了一些函数用于进行图像运算.

图像的四则运算

要对两个图像进行四则运算,要求这两个图像的尺寸相同.下面是常用的图像四则运算函数,具体细节请参考官方文档.

函数 作用
imabsdiff() 两个图像求差值
imadd() 一个图像加上另一个图像或常数
imsubtract() 一个图像减去另一个图像或常数
immultiply() 一个图像乘以另一个图像或常数
imdivide() 一个图像除以另一个图像或常数
imcomplement() 对图像取反
I=imread('rice.png');
subplot(1,2,1); imshow(I);
J=immultiply(I, 1.5);
subplot(1,2,2); imshow(J);

在这里插入图片描述

I=imread('rice.png'); J=imread('cameraman.tif'); 
K=imadd(I,J);
subplot(1,3,1); imshow(I);
subplot(1,3,2); imshow(K);
subplot(1,3,3); imshow(J); 

在这里插入图片描述

可以看到,进行加法操作后,得到的图像比原本的两个都亮,这是因为图像矩阵的数值整体上增加了.

像素的统计分布

使用imhist()函数可以分析像素值的统计分布.

I = imread('pout.tif');
imhist(I)

在这里插入图片描述

使用histeq()可以增大图像的对比度,这本质上做了直方图的均衡化(Histogram Equalization)操作.

I = imread('pout.tif'); I2 = histeq(I);
subplot(1,4,1); imhist(I);
subplot(1,4,2); imshow(I);
subplot(1,4,3); imshow(I2);
subplot(1,4,4); imhist(I2);

在这里插入图片描述

图像的二值化

将灰度图像变为二值图像的过程被称为二值化,MATLAB内置了两个与二值化相关的函数.

  • graythresh()函数用于计算二值化变换过程中的最优阈值(threshold).灰度图像上超过该阈值的点将被赋值为1,低于该阈值的点将被赋值为0.
  • im2bw()用于进行二值化变换.
I = imread('rice.png'); 
level=graythresh(I); bw=im2bw(I, level); 
subplot(1,2,1); imshow(I);
subplot (1,2,2); imshow(bw)

在这里插入图片描述

图像的几何变换

图像的几何变换本质上就是将图像乘以一个矩阵得到新图像的过程.

变换形式 图形示意 数学变换 MATLAB函数
位移(Translation) 在这里插入图片描述 [xy1]=[10tx01ty001][xy1]\left[\begin{array}{c} x' \\ y' \\ 1 \end{array}\right] =\left[\begin{array}{c} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{array}\right] * \left[\begin{array}{c} x \\ y \\ 1 \end{array}\right] imtranslate()
缩放(Scale) 在这里插入图片描述 [xy1]=[sx000sy0001][xy1]\left[\begin{array}{c} x' \\ y' \\ 1 \end{array}\right] =\left[\begin{array}{c} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{array}\right] * \left[\begin{array}{c} x \\ y \\ 1 \end{array}\right] imresize()
错切(Shear) 在这里插入图片描述 [xy1]=[1hx0hy10001][xy1]\left[\begin{array}{c} x' \\ y' \\ 1 \end{array}\right] =\left[\begin{array}{c} 1 & h_x & 0 \\ h_y & 1 & 0 \\ 0 & 0 & 1 \end{array}\right] * \left[\begin{array}{c} x \\ y \\ 1 \end{array}\right]
旋转(Rotate) 在这里插入图片描述 [xy1]=[cosθsinθ0sinθcosθ0001][xy1]\left[\begin{array}{c} x' \\ y' \\ 1 \end{array}\right] =\left[\begin{array}{c} \cos\theta & \sin\theta & 0 \\ -\sin\theta & \cos\theta & 0 \\ 0 & 0 & 1 \end{array}\right] * \left[\begin{array}{c} x \\ y \\ 1 \end{array}\right] imrotate()
I = imread('rice.png'); J = imrotate(I, 35, 'bilinear');
subplot(1,2,1);	imshow(I); 
subplot(1,2,2); imshow(J);
size(I)	% 得到 [256, 256]
size(J)	% 得到 [357, 357]

在这里插入图片描述

可以看到,进行旋转变换后,图像的尺寸增加了.

使用MATLAB分析图像:目标计数

我们想要通过MATLAB分析rice.png图片中米粒的个数.

在这里插入图片描述

图像预处理

要分析图像中的米粒个数,我们需要对图像进行两步预处理:

  1. 去除图像的背景:

    I = imread('rice.png');
    subplot(1,3,1); imshow(I);
    BG = imopen(I, strel('disk', 15));
    subplot(1,3,2); imshow(BG);
    I2 = imsubtract(I, BG);
    subplot(1,3,3); imshow(I2);
    

    在这里插入图片描述

  2. 对图像进行二值化:

    I2 = imsubtract(I, BG); level=graythresh(I2);
    bw2 = im2bw(I2, level); 
    

下面代码展示了是否去除背景对图像二值化结果的影响:

% 直接对图像进行二值化
I = imread('rice.png'); 
level=graythresh(I); bw = im2bw(I, level);
subplot (1,2,1); imshow(bw); title('直接进行二值化');

% 去除背景后对图像进行二值化
BG = imopen(I, strel('disk', 15)); I2 = imsubtract(I, BG); 
level=graythresh(I2); bw2 = im2bw(I2, level);
subplot(1,2,2); imshow(bw2); title('去除背景后进行二值化');

在这里插入图片描述

目标计数:标记连通区域

识别米粒个数的关键在于识别连通区域.

在这里插入图片描述

在这里,我们使用MATLAB自带的bwlabel()函数计算连通区域,该函数使用了连通区域标记算法,将每个连通区域内的像素点赋值为同一个值.

在这里插入图片描述

I=imread('rice.png');
BG=imopen(I, strel('disk', 15));
I2=imsubtract(I, BG); level=graythresh(I2);
BW=im2bw(I2, level);
[labeled, numObjects]=bwlabel(BW, 8);

得到labeled为标记好的矩阵,其尺寸与原图片相同,每个连通区域都被赋值为一个相同的整数,其他区域被赋值为0.numObjects为计算出的连通区域个数,为99.

使用label2rgb()函数可以将标记结果以彩色图片的形式展示

RGB_label=label2rgb(labeled); 
imshow(RGB_label);

在这里插入图片描述

分析检测结果

使用regionprops()函数可以将检测结果封装成结构体数组.

graindata = regionprops(labeled, 'basic');
graindata(51)
       Area: 155
   Centroid: [112.4258 245.8645]
BoundingBox: [108.5000 234.5000 8 22]

使用bwselect()函数可以交互式选择连通区域

ObjI = bwselect(BW); 
imshow(ObjI);

在这里插入图片描述

2019-11-13 09:12:02 Harbour_zhang 阅读数 33

二值图像是指在图像中,灰度等级只有两种,也就是说,图像中的任何像素点的灰度值均为0或者255,分别代表黑色和白色。

在图像处理中,常用的二值图像是‘.TIF’格式的。这种格式的文件,每一个像素只由1比特的 0 或者 1组成。

例如,一张这样的二值图像:

在这里插入图片描述
在MATLAB 读取后,是一个256 * 256 的 由 0 或 1 组成的矩阵。

下面贴出把JPG格式图片转为TIF的MATLAB代码 :

img = imread('lena.jpg');  % 读取图片
i = rgb2gray(img)          % 转为灰度图片
level = graythresh(i);     % 自动选择转换为二值图像的阈值
b=imbinarize(i,level);     % 图像二值化
imshow(b);				   % 显示图片


imwrite(b,'lena.tif');      % 存储图片
2017-05-19 19:46:21 guyuealian 阅读数 16881

Matlab形态学图像处理:二值图像分割 标记连通区域和重心位置 删除连通区域

尊重原创,转载请注明出处】http://blog.csdn.net/guyuealian/article/details/71440949
    Matlab中可以使用graythresh(Img)函数设置二值化的阈值,再用im2bw转化为二值图像。在Matlab中,可以使用bwlabel()和bwlabeln()函数来标记二值图像的连通区域。需要注意的是:所谓的连通区域标记是指对二值图像中白色像色而言,即值为1的像素进行标记,而黑色像素看作是背景颜色。当然,Matlab中还有个regionprops()函数可以用于统计图像区域的属性,如面积大小,重心位置。关于bwlabel()、bwlabeln()和regionprops()的用法,请查看相关博客吧

    本博客Matlab代码将实现的功能:将图像转为二值图像,分割出感兴趣的区域,并用“红色矩形线框”标记连通区域的面积,用蓝色点标记连通区域的重心位置,为了减少噪声的干扰,代码中将连通区域面积(像素个数)不足100的区域认为是噪声点,并将其删除(即置为背景黑色)。本人用PS制作了一个GIF动画图,以便大家观看效果图:

clc;clear all;close all
%% 清空变量,读取图像,并显示其属性
clear;close all
src = imread('rice.jpg');
%显示原始图像
figure,
subplot(2,2,1),imshow(src),title('原图')

%用ostu方法获取二值化阈值,进行二值化并进行显示
level=graythresh(src);
bw=im2bw(src,level);
subplot(2,2,2),imshow(bw),title('二值图像')

%运用开操作消去噪点
se = strel('disk',2);
openbw=imopen(bw,se);%对白色点而言
subplot(2,2,3),imshow(openbw),title('开运算后的效果图')

%获取连通区域,并进行显示
% L = bwlabel(openbw,8);
[L,num] = bwlabel(openbw,8);
RGB = label2rgb(L);
subplot(2,2,4),imshow(RGB),title('用rgb颜色标记不同区域')

%获取区域的'basic'属性, 'Area', 'Centroid', and 'BoundingBox' 
% stats = regionprops(openbw, 'basic');
 stats = regionprops(openbw, 'BoundingBox' ,'Area','Centroid' ,'PixelList' ); %统计白色的连通区域
centroids = cat(1, stats.Centroid);

%%
noiseArea=100;
figure,imshow(openbw),title('2')  
hold on
for i=1:size(stats)
    imshow(openbw)
    rectangle('Position',[stats(i).BoundingBox],'LineWidth',2,'LineStyle','--','EdgeColor','r'),
    plot(centroids(i,1), centroids(i,2), 'b*');             %每个连通区域的重心位置
    area = stats(i).Area;                                   %连通区域的面积
    if area<noiseArea                                       %若当前连通区域面积小于噪声点的面积,则该区域设置为0
        pointList = stats(i).PixelList;                     %每个连通区域的像素位置
        rIndex=pointList(:,2);cIndex=pointList(:,1);
        pointList = stats(i).PixelList;                     %连通区域的像素坐标
        openbw(rIndex,cIndex)=0;                            %连通区域的面积不足100,置为背景颜色
    end
    pause(1);
    saveas(gcf,sprintf('img/%d',i),'jpg')                   %保存图片
end
hold off





2019-10-15 09:36:34 weixin_43262648 阅读数 179

Matlab遥感数字图像处理——统计值计算

clear,clc;   %清空工作区,清屏
result = IMG_Read('NVIS.dat');
% result = IMG_Read('Sandiego.img');
% result = IMG_Read('TM.dat');
% result = IMG_Read('can.dat');
% result = IMG_Read('TM-30m.dat');
% result = IMG_Read('Beijing.dat');

datatype = cell2mat(result(1));
Image = cell2mat(result(2));
[lines,samples,bands] = size(Image);

IMG = Image(:,:,1);        %只读取图像的一个波段
IMAGE = reshape(IMG,1,[]); %将二维矩阵转换为一维数组
IMGnum = samples*lines;

IMGsum = 0;
IMGVAR = 0;
IMGCOV = 0;

fid=fopen('统计结果.txt','w');

%求单波段数据的均值
IMGmean = mean(IMAGE)
% for i=1:IMGnum
%     IMGsum = IMGsum + IMAGE(i);
% end
% IMGmean = IMGsum/IMGnum;
fprintf(fid,'%7s %12s\r\n','统计量','统计值');
fprintf(fid,'%7s %17f\r\n','均值',IMGmean);

%对单波段数据排序
IMAGE1 = IMAGE;
IMAGE1 = sort(IMAGE1);
% for j = 1:IMGnum
%  for i = 1:IMGnum-j
%         if(IMAGE1(i)>IMAGE1(i+1))
%             temp = IMAGE1(i);
%             IMAGE1(i) = IMAGE1(i+1);
%             IMAGE1(i+1) = temp;
%         end
%     end
% end

% 求单波段数据的中值
IMGmedian = median(IMAGE1)
% if mod(IMGnum,2)==0
%     IMGmedian = (IMAGE1(IMGnum/2)+IMAGE1(IMGnum/2+1))/2;
% else 
%     IMGmedian = IMAGE1(fix(IMGnum/2));
% end
fprintf(fid,'%7s %17f\r\n','中值',IMGmedian);

%直方图统计
IMGmax = max(IMAGE1)
numbers = zeros(2,IMGmax);
for k = 1:IMGmax+1
    numbers(1,k) = k-1;  
    numbers(2,k)= 0;
end
for i = 1:samples*lines
        for k = 1:IMGmax+1
             if IMAGE1(1,i)== numbers(1,k)
                 numbers(2,k) = numbers(2,k)+1;
             end
        end
end

%累计直方图统计
NUMBER = zeros(2,fix(IMGmax));
NUMBER(2,1) = numbers(2,1);
for k = 2:IMGmax+1
    NUMBER(1,k) = k-1;  
    NUMBER(2,k) = NUMBER(2,k-1) + numbers(2,k); 
end

% 求单波段数据的众数
IMGmode = mode(IMAGE1(1,:))
fprintf(fid,'%7s %17f\r\n','众数',IMGmode);
% for i = 1:IMGmax
%     if(numbers(2,i)== max(numbers(2,:)))
%         IMGmode = i-1;
%     end
% end

% 求单波段数据的方差
IMGvar = var(IMAGE)
% for i = 1:IMGnum
%    IMGVAR = IMGVAR+ (IMAGE(i)-IMGmean) ^2;
% end
% IMGvar = IMGVAR/IMGnum
fprintf(fid,'%7s %17f\r\n','方差',IMGvar);

%前两个波段的协方差
IMG2 = Image(:,:,2);
IMAGE2 = reshape(IMG2,1,[]);
IMGcov = cov(IMAGE,IMAGE2)
% IMGmean2 = mean(IMAGE2);
% for i = 1:IMGnum
%    IMGCOV = IMGCOV+ (IMAGE(i)-IMGmean) * (IMAGE2(i)-IMGmean2);
% end
% IMGcov = IMGCOV/IMGnum
fprintf(fid,'%7s\r %16f %10f\r\n %26f %10f\r\n','协方差',IMGcov);

%前两个波段的相关系数
IMGcorrcoef = corrcoef(IMG,IMG2)
% TMGcorrcoef = IMGcov/((IMGvar^0.5)*(var(IMAGE2))^0.5)
fprintf(fid,'%7s\r %14f %10f\r\n %25f %10f\r\n','相关系数',IMGcorrcoef);
fclose(fid);

%绘制单波段数据的直方图
figure(2)
subplot(1,3,1);
hist(IMAGE1,IMGmax)
title('第一个波段灰度直方图');
% IMGhist = hist(IMAGE,IMGmax);

subplot(1,3,2);
hist(IMAGE2,max(IMAGE2));
title('第二个波段灰度直方图');
% IMGhist2 = hist(IMAGE2,max(IMAGE2));

subplot(1,3,3);
IMG3 = Image(:,:,3);
IMAGE3 = reshape(IMG3,1,[]);
hist(IMAGE3,max(IMAGE2))
title('第三个波段灰度直方图');
% IMGhist3 = hist(IMAGE3,max(IMAGE2));

Matlab图像二值化

阅读数 34077

没有更多推荐了,返回首页