MATLAB教学_09影像处理二

2023-11-08

本文视频地址:https://www.bilibili.com/video/av68228488?p=9

主要学习了初阶影像处理。有三个内容:

  1. 图像阈值
  2. 背景预测
  3. 相关连的标签

计算米粒颗数

先将图片二值化。那么有米粒的区域应该是1,而没有的地方就是0。那么去计算有多少个一大群1的个数就可以。

graythresh()

T=graythresh() ,从灰度图像 I 计算一个全局阈值T,使用 Otsu的方法。这个方法是选择一个相对于黑像素和白像素最小的一个方差。

全局阈值T可以用来将灰度图像转换为二值图像,使用 imbinarize. 阈值T肯定是属于 [0 1] 区间。

BW= imbinarize( I )

从2D 或 3D灰度图像 I 创建一个二值化图像,通过将所有数值用全局阈值转换为0 或者是1。

im2bw()

BW=im2bw(I ,level) , 将灰度图转换为二值化图像。通过将所有的像素用亮于 level 的变为1, 低于 level 的变为0。

I =imread('rice.png');
level=graythresh(I);    %计算最佳阈值
bw=im2bw(I,level);      %将灰度图转换为二值化图
subplot(1,2,1); imshow(I);
subplot(1,2,2); imshow(bw);

根据这个图可以看到,如果我们选择不同的阈值就会显示不同的图像。阈值的好坏很重要。

 

14分钟练习

clear all;       %14分钟练习
I =imread('rice.png');
Z=I;
level=graythresh(I);    %计算最佳阈值
a=255 * level;
for i=1:size(I,1)
    for j=1:size(I,2)
        if I(i,j) >a
            Z(i,j)=255;    %因为这里不是二值化图,所以最大应该是255,而不是1
        else
            Z(i,j)=0;
        end
    end
end
imshow(Z);

先算出背景,然后不背景去掉

imopen(I,SE)

用到一个函数  J=imopen(I,SE)

执行形态开放用于灰度图像或者是二值图像 I, 返回一个开放图像。SE 是一个单独结构化的元素对象,通过 strel 或者 offsetstrel 函数来返回。也就是说 SE 其实又是一个函数,这个函数是  strel 或者 offsetstrel 。

形态开放操作是先侵蚀后扩张,两种操作使用相同的结构元素。

具体可以查看MATLAB帮助文件:https://ww2.mathworks.cn/help/images/ref/imopen.html

strel

一个strel对象代表一个平坦的形态结构元素,它是形态扩张和侵蚀操作的重要组成部分。

平面结构元素是一种二维或多维的二值邻域,其中真实像素包含在形态计算中,而虚假像素不包含在形态计算中。结构元素的中心像素称为原点,它标识正在处理的图像中的像素。使用strel函数(如下所述)创建一个平面结构元素。您可以对二进制和灰度图像使用平面结构元素。下图说明了一个平面结构元素。

SE= strel('disk',r,n)

创建一个磁盘形状的结构元素,其中r指定半径,n指定用于近似磁盘形状的线结构元素的数量。当结构元素使用近似值时,使用磁盘近似值的形态操作运行得快得多。

除了 disk, 还有很多其它的。例如  nhood, diamond, octagon 等等。

具体可以查看MATLAB帮助文件:https://ww2.mathworks.cn/help/images/ref/strel.html#bu7pnvx-1

offsetstrel

offsetstrel 它不是平面的。这里再不详细说明。

 

clear all;       %23分钟练习
I =imread('rice.png');
SE=strel('disk',2);  %创建一个半径为像素2的圆盘形结构元素。
BG= imopen(I,SE);    %%将半径小于2像素的 磁盘状的在图像I中去掉
subplot(2,3,2);imshow(BG,[]); %  将最小值显示为黑色,最大显示为白色
subplot(2,3,4); imshow(I);
subplot(2,3,5);
SE=strel('disk',15);  %创建一个半径为像素15的圆盘形结构元素。
BG= imopen(I,SE);    %将半径小于15像素的 磁盘状的在图像I中去掉
       %如果将半径小于15的像素去掉的话,基本上是把所有的白色米粒全部都去掉了,只省一个背景
imshow(BG);
subplot(2,3,6); 
I2=imsubtract(I,BG);   %将原图减去背景,可以得到比较清楚的图了,但小区域的杂点还是存在
imshow(I2);

当  SE=strel('disk',5);   时,我们来看看SE 是什么。它会创建一个对象,在这里以半径为5像素,其它为0。作一个圆。当在 imopen里探索时,当里面大致颜色相同的区域小于5个像素时,会移除掉。

23分钟练习

clear all;       %23分钟练习
I=imread('rice.png');   level=graythresh(I);
bw=im2bw(I,level);
subplot(2,2,1); imshow(bw);
BG=imopen(I,strel('disk',15));
I2=imsubtract(I,BG);    level=graythresh(I2);
bw2=im2bw(I2,level);
subplot(2,2,2); imshow(bw2);
BG1=imopen(I,strel('disk',4));   %直接将半径放小到4像素,显示到3上
level1=graythresh(BG1);          %将此图求阈值
bw3=im2bw(BG1,level1);           %转换为二值图,全用算出来的阈值
subplot(2,2,3); imshow(BG1);
subplot(2,2,4); imshow(bw3);     %此图我发现转换的不准确,我手动将阈值放小一点,0.42,发现显示会好点。但依然没有老师的方法好

 

 

Connected-component Labeling:bwlabel()

这个方法就是在一张二值化图里寻找像素在一起的群。并把他们分开。左侧的Binary 是二值 化图,右侧的Label 是一个 Label 矩阵。搜寻出来的数据会在这个矩阵里更新。下面将以下是如何工作的:

看弹幕说这个方法就是 BFS

 先从第一行第一列搜索,找到第一个1,并以这个1为圆心,向右和向下寻找是否否也有1。

寻找过的地方则在Binary里标为0,在Label里标为1。直到向右向下再没有发现1。则这一团数据寻找完毕。

继续扫描,再找的1,就是第二团数据的开始,标为2。依次类推,有多少个团,就有多少团数据。

bwlabel()

L = bwlabel(BW)

返回一个label矩阵L,默认为8连接方式。

L = bwlabel(BW,conn)

返回一个label矩阵L, conn可以选择为8连接方式或者是4连接方式。

[L,n] = bwlabel(___)

返回一个label矩阵L, n 是返回里面有多少团数据 。

以下是8连接和4连接的说明:

clear all;       %34分钟练习
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);

38分钟练习

clear all;       %38分钟练习
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);  %labelded 是矩阵, numObjects是有多少团数据.8是8连接。弹幕说4连接不好在这里
num=zeros(1,numObjects);
for k=1:numObjects       %能过遍历,从labeled里寻找1-99,每个数的个数。放到一个1*99的矩阵里。
    for i=1:size(labeled,1)
        for j=1:size(labeled,2)
            if labeled(i,j)==k
                num(1,k)=num(1,k)+1;
            end
        end
    end
end
% max=0;
% for i=1:numObjects      %从num矩阵里找到最大值。
%     if max<num(1,i)
%         max=num(1,i);
%     end
% end
means=mean(num)        %平均值
z=max(num)             %从num矩阵里找到最大值。如果要使用上面打注释的语法,记得不要用max这个名字。因为你相当于自定义了,所以不能够再使用内置函数max()

label2rgb()

颜色显示 

 

44分钟练习

%%
clear all; clc;   %44分钟练习
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);  %labelded 是矩阵, numObjects是有多少团数据.8是8连接。弹幕说4连接不好在这里
num=zeros(1,numObjects);
for k=1:numObjects       %能过遍历,从labeled里寻找1-99,每个数的个数。放到一个1*99的矩阵里。
    for i=1:size(labeled,1)
        for j=1:size(labeled,2)
            if labeled(i,j)==k
                num(1,k)=num(1,k)+1;
            end
        end
    end
end
subplot(1,3,1); hist(num,20);     %将num 用直方图表示出来,分了20个bin
axis square;
[m n]=size(I);
red_map=zeros(m,n,3);      %因为RGB图是由三色决定的,所以给每一个像素分配一个[R G B],因为只要改红色,所以先默认[0 0 0]
for i=1:size(I,1)
    for j=1:size(I,2)
        if BW(i,j)==1
            red_map(i,j,1)=255;  %将有米粒的地方设置为[255 0 0],也就是红色
        end
    end
end
subplot(1,3,2); 
imshow(red_map);   %通过imshow() 把矩阵 red_map 显示出来
            
j=1;              %将面积小于100的米去掉,原有数据变为2行的矩阵,每一列代表米粒的编号和面积。
new_num=zeros(2,numObjects);
new_num(1,:)=[1:numObjects];
new_num(2,:)=num;
for i=1:size(new_num,2)
    if new_num(2,i) < 100         %如果面积小于100,记下米粒的编号
        ab(j)=new_num(1,i);
        j=j+1;
    end
end

for k=1:size(ab,2)       %将面积小于100的米,颜色设置为0,也就是黑色。
    for i=1:size(labeled,1)
        for j=1:size(labeled,2)
            if labeled(i,j)==ab(k)
                labeled(i,j)=0;
            end
        end
    end
end

subplot(1,3,3); 
imshow(labeled);

 

regionprops()

stats = regionprops(BW,properties) 

返回二进制图像BW中每个8连接组件(对象)的属性指定的属性集的度量值。stats是一个结构数组,其中包含图像中每个对象的结构。

在这个结构数组里,反映三个数据:面积(用多少个像素表示)、中心点、四个边界点,具体如下:

 

clear all;                %49分钟练习
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);
graindata=regionprops(labeled,'basic');    %把labeled的值通过regionprops函数存储
graindata(51)            %显示第51个数据

bwselect()

  • 选择二进制图像中的对象

BW2 = bwselect(BW,c,r,n) 

返回在图像BW中选择的坐标(r,c)的图像,其中n 是表示 是4连接还是8连接。默认是4连接。

BW2 = bwselect(BW,n) 

在屏幕上显示图像BW,并允许您使用鼠标选择(r,c)坐标。如果您省略了BW, bwselect将对当前轴中的图像进行操作。使用正常的按钮点击添加点。按下Backspace或Delete以删除先前选择的点。按住shift键单击、右键单击或双击可以选择最后一个点;按Return完成选择,不添加点。在程序中老师用的就是这个语法。

%%
I=imread('rice.png');   %52分钟练习
BG=imopen(I,strel('disk',15));
I2=imsubtract(I,BG);    level=graythresh(I2);
BW=im2bw(I2,level);
ObjI=bwselect(BW);      %用鼠标选择坐标
imshow(ObjI);           %显示出所选择的图像

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MATLAB教学_09影像处理二 的相关文章

  • 命令 A(~A) 在 matlab 中的真正作用是什么

    我一直在寻找找到矩阵非零最小值的最有效方法 并在论坛上找到了这个 设数据为矩阵A A A nan minNonZero min A 这是非常短且高效的 至少在代码行数方面 但我不明白当我们这样做时会发生什么 我找不到任何关于此的文档 因为它
  • MATLAB 编译器与 MATLAB 编码器

    两者有什么区别 据我了解 MATLAB Compiler将MATLAB代码包装成 exe文件 这样就可以在不安装MATLAB的情况下使用它 并且只需要MCR 除此之外 MATLAB Builder NE 还可以用于生成与 Net 框架一起使
  • matlab中无限while嵌套在for循环中

    我想做一个while循环 嵌套在for在 Matlab 中循环以查找数据中不同对之间的距离 我的数据具有以下形式 ID lon lat time 1 33 56 40 89 803 2 32 45 41 03 803 3 35 78 39
  • 禁止 MATLAB 自动获取焦点[重复]

    这个问题在这里已经有答案了 我有以下问题 在我的 MATLAB 代码中 我使用如下语句 figure 1 更改某些数据的目标数字 问题是 在此 MATLAB 之后 系统将焦点集中在具有该图形的窗口上 当我在后台运行一个大脚本并尝试在计算机上
  • 如何将数据传递给 MATLAB oncleanup 函数?

    我有一个编译好的 matlab 程序 可以自动调整机器参数 在调整周期结束时 我需要恢复一些原始设置 有时会发生意外错误 有时用户会发现调整算法未正常工作 因此应终止 使用 control C 如果发生可预测的错误 我可以使用 try ca
  • 通过多次合并相同的行向量来构建矩阵

    有没有一个matlab函数可以让我执行以下操作 x 1 2 2 3 然后基于x我想建立矩阵m 1 2 2 3 1 2 2 3 1 2 2 3 1 2 2 3 您正在寻找REPMAT http www mathworks com help t
  • 如何选择面积最大的对象?

    我用过bwconvhull检测图像的某个部分 正如您在图像中看到的那样 有许多具有特定质心的对象 我想做的是检测面积最大的物体 左起第一个大物体 并忽略其他物体 我应该遵循哪种方法 我将非常感谢您的帮助 以下是代码 由于我仍在努力 所以写得
  • 像matlab一样在python中连接数组而不知道输出数组的大小

    我正在尝试在 python 中连接数组 类似于 matlab array1 zeros 3 500 array2 ones 3 700 array array1 array2 我在 python 中做了以下操作 array1 np zero
  • 使用不同的背景颜色保存 MATLAB 图窗

    我想打印一个带有深色背景和白色标签的 MATLAB 图 如果我使用print or saveas命令我不知何故失去了颜色 绘图符号再次变暗 背景变为白色 points rand 100 3 plot3 points 1 points 2 p
  • 拟合具有扭曲时基的正弦波

    我想知道在 Matlab 中拟合具有扭曲时基的正弦波的最佳方法 时间失真由 n 阶多项式 n 10 给出 其形式为t distort P t 例如 考虑失真t distort 8 12t 6t 2 t 3 这只是幂级数展开 t 2 3 这将
  • MATLAB 中的逻辑数组与数值数组

    我正在比较两个二进制数组 我有一个数组 其中值可以是一或零 如果值相同则为 1 如果不同则为零 请注意 我正在做检查之外的其他事情 因此我们不需要进入矢量化或代码的性质 在 MATLAB 中使用数值数组和逻辑数组哪个更有效 Logical
  • 在 Python 上显示 Matlab mat 文件中的图像

    我目前正在尝试显示从此下载的 Mat 文件中的图像site http www rctn org bruno sparsenet 这是一个 mat 文件 所以我尝试使用 scipy io loadmat 函数加载它 但我似乎无法绘制图像 我究
  • 二维随机微分方程 (SDE)

    我第一次研究随机微分方程 我正在寻求模拟和求解二维随机微分方程 模型如下 dp F t p dt G t p dW t where p 是一个 2 1 向量 p theta t phi t F是列向量 F sin theta Psi cos
  • 在 MATLAB 中验证输入的最佳实践

    在验证 MATLAB 函数中的输入时 什么时候使用 inputParser 比使用断言更好 或者还有其他更好的工具可用吗 我个人发现使用 inputParser 不必要地复杂 对于 Matlab 始终需要检查 3 项内容 存在 类型和范围
  • 计算向量的导数

    我有以下函数 维维亚尼曲线 Phi t cos t 2 cos t sin t sin t 只需检查它是否有效 s linspace 0 T 1000 plot3 cos s 2 cos s sin s sin s 如何推导函数Phi 可能
  • 使用 scipy.io 将 python pandas dataframe 转换为 matlab 结构

    我正在尝试使用 scipy io 将 pandas 数据帧保存到 matlab mat 文件 我有以下内容 array1 np array 1 2 3 array2 np array a b c array3 np array 1 01 2
  • MATLAB 问题中的 Parfor

    为什么我不能使用parfor在这段代码中 parfor i 1 r for j 1 N r xr j N r i 1 x i r j 1 end end 这是错误 错误 parfor 中的变量 xr 无法分类 请参阅 MATLAB 中的并行
  • 在 numpy/scipy 中查找 matlab 函数

    是否有一个等价的函数find A gt 9 1 来自 numpy scipy 的 matlab 我知道有nonzeronumpy 中的函数 但我需要的是第一个索引 以便我可以在另一个提取的列中使用第一个索引 Ex A 1 2 3 9 6 4
  • MATLAB;具有 2+ 个/分割图例的饼图 R2017b

    我正在创建一个饼图 理想情况下希望图例水平显示在顶部和 或底部 然而 在几乎所有情况下 这是不可能的 因为图例超出了数字 因此 我理想情况下希望将图例分成两个 或更多 子图例并单独放置它们 我知道这不是 MATLAB 中的内置功能 我使用的
  • UDP接收和发送Matlab

    我目前正在努力从外部设备接收数据包 然后将数据发送到另一个设备 我有一个工作 Simulink 模型 但我不知道如何在 Matlab 中对其进行编码 Matlab 中 UDP 接收块的参数如下图所示UDP 接收参数 https i stac

随机推荐

  • 用户画像常见应用场景+技术实现

    导读 今天和大家分享的主题是用户画像的场景与技术实现方案 主要分三大部分 用户画像常见应用场景 画像产品功能 技术实现方案 01 常见应用场景 1 画像常见的应用场景 不同行业业务属性不同 能采集到的数据源也不同 对画像的应用场景有不同的需
  • 代码随想录算法训练营第一天

    文章目录 数组704 二分查找 题目 难度 示例 算法 二分查找法 循环不变量 两种写法 疑难点分析 算法复杂度分析 数组27 移除元素 题目 难度 示例 算法 暴力 双指针 数组704 二分查找 梦开始的地方 day1 2023 4 19
  • 基于MATLAB的图片中字符的分割与识别

    基于MATLAB的字符的分割与识别 摘 要 本文主要介绍字符识别的基本原理 并且利用MATLAB工具软件实现图片中字符的分割和识别 对于满足一定要求的图片可以实现字符的分割与识别 通过图像读取 图像预处理 图像投影 字符分割 字符识别五个步
  • 一维数组部分实验

    学习目标 1 理解数组的概念 掌握数组的定义及其存储结构 2 掌握一维数组的输入 输出及初始化的方法 3 掌握一维数组的使用 4 掌握与数组有关的算法 学习内容 1 编写程序 将10个整型数2 4 6 18 20赋予一个数组 然后输出该数组
  • 【C语言】初识指针

    C语言 初识指针 一 指针是什么 二 指针和指针类型 1 指针 整数 2 指针的解引用 三 野指针 1 野指针成因 2 如何规避野指针 四 指针运算 五 二级指针 七 指针数组 个人主页 库库的里昂 CSDN新晋作者 欢迎 点赞 评论 收藏
  • c的按位取反运算符(~) 与逻辑逻辑(!)

    位运算 位运算的运算分量只能是整型或字符型数据 位运算把运算对象看作是由二进位组成的位串信息 按位完成指定的运算 得到位串信息的结果 位运算符有 按位与 按位或 按位异或 按位取反 其中 按位取反运算符是单目运算符 其余均为双目运算符 位运
  • ffmpeg 采集音频数据

    音视频数据采集的步骤 设备注册 设置对应的采集方式 avfoundation dshow alas 打开设备 具体的例子 include
  • 什么是导航与位置服务器,GPS导航和GPS定位仪与GPS定位器的区别在哪?

    也许很多人时常都能听到GPS定位器 GPS导航 GPS定位仪这三个词 但都不是很了解GPS定位器 GPS导航和GPS定位仪这三者间的区别 往往都很模糊 那么 这三者到底分别是什么设备 又有哪些我们不知道的区别呢 一 GPS导航 但凡是自己有
  • 学成在线笔记+踩坑(2)——【内容模块】课程基础查询,swagger+数据库字典+Httpclient+跨域

    导航 黑马Java笔记 踩坑汇总 JavaSE JavaWeb SSM SpringBoot 瑞吉外卖 SpringCloud 黑马旅游 谷粒商城 学成在线 牛客面试题 java黑马笔记 目录 1 内容模块 需求分析 2 内容模块 模块工程
  • jdbc链接mysql8的url

    jdbc链接mysql8的url 使用jar或者maven依赖不同 java与mysql8 0连接Jdbc驱动的配置参数 驱动 driver com mysql cj jdbc Driver 字符串 jdbc url jdbc mysql
  • redis 缓存击穿 看一篇成高手系列3

    什么是缓存击穿 在谈论缓存击穿之前 我们先来回忆下从缓存中加载数据的逻辑 如下图所示 因此 如果黑客每次故意查询一个在缓存内必然不存在的数据 导致每次请求都要去存储层去查询 这样缓存就失去了意义 如果在大流量下数据库可能挂掉 这就是缓存击穿
  • 自己实现c++ list模板类,亲测可用

    双向链表模板类 dlist h ifndef DLIST H define DLIST H include
  • 秋招-准备计划

    秋招 准备计划 基本信息 时间 9月 10月 岗位 java后端开发 目标 中厂 大厂 有高用户量的项目 企业优先 准备 简历 基本信息 获奖情况 项目经历 实习经历 笔试 算法与数据结构 面试 Java篇 基本知识 JVM JUC多线程
  • SQLserver分页 高效率

    SQL Server 存储过程的分页 这个问题已经讨论过几年了 很多朋友在问我 所以在此发表一下我的观点建立表 CREATE TABLE TestTable ID int IDENTITY 1 1 NOT NULL FirstName nv
  • 什么是云计算,云计算的基本原理是什么?

    云计算 cloudcomputing 分布式计算技术的一种 其最基本的概念 是透过网络将庞大的计算处理程序自动分拆成无数个较小的子程序 再交由多部服务器所组成的庞大系统经搜寻 计算分析之后将处理结果回传给用户 透过这项技术 网络服务提供者可
  • 在偏远乡村感受中国电信优厚服务

    春节期间 笔者在家使用中国电信天翼上网卡的过程中发现 目前中国电信的3G网络覆盖在偏远乡村还不是很到位 不过在3G市场的激烈竞争中 运营商的服务意识却有着明显的提升 笔者从北京回家过年 在江西南昌市的一家电信营业厅购买了3G上网卡 当时得知
  • Vue3引用Dplayer播放器播放m3u8,hls播放协议

    一 安装 npm安装Dplayer npm install S Dplayer yarn安装Dplayer yarn add Dplayer 播放协议为 hls 安装hls npm install hls js S 二 代码 我用的是vue
  • sed 命令的高级用法

    编辑命令 d 删除 p 显示模式空间的内容 a text 在行后面追加文本 支持使用 n实现多行追加 i text 在行前面插入文本 支持使用 n实现多行插入 c text 替换行为单行或多行文本 w path to somefile 保存
  • 查看服务器信息

    1 查看 CPU 物理个数 grep physical id proc cpuinfo sort u wc l 2 查看 CPU 核心数量 grep core id proc cpuinfo sort u wc l 3 查看 CPU 线程数
  • MATLAB教学_09影像处理二

    本文视频地址 https www bilibili com video av68228488 p 9 主要学习了初阶影像处理 有三个内容 图像阈值 背景预测 相关连的标签 计算米粒颗数 先将图片二值化 那么有米粒的区域应该是1 而没有的地方