MATLAB教学_09影像处理二

article/2025/5/15 6:20:12

本文视频地址: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) >aZ(i,j)=255;    %因为这里不是二值化图,所以最大应该是255,而不是1elseZ(i,j)=0;endend
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)==knum(1,k)=num(1,k)+1;endendend
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)==knum(1,k)=num(1,k)+1;endendend
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)==1red_map(i,j,1)=255;  %将有米粒的地方设置为[255 0 0],也就是红色endend
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
endfor 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;endendend
endsubplot(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);           %显示出所选择的图像

 

 


http://chatgpt.dhexx.cn/article/17Dc4wXx.shtml

相关文章

【计算机视觉】图像增强——图像的形态学操作

个人简介&#xff1a; > &#x1f4e6;个人主页&#xff1a;赵四司机 > &#x1f3c6;学习方向&#xff1a;JAVA后端开发 > ⏰往期文章&#xff1a;SpringBoot项目整合微信支付 > &#x1f514;博主推荐网站&#xff1a;牛客网 刷题|面试|找工作神器 > &#…

数字图像处理实验(七)| 形态学图像处理{生成结构元素strel、腐蚀运算imerode、膨胀运算imdilate、开运算imopen、闭运算imclose}(附代码和实验截图、汉字视力表项目、总结)

文章目录 一、实验目的二、实验仪器三、实验原理1. 结构元素&#xff1a;2. 腐蚀运算&#xff1a;3. 膨胀运算&#xff1a;4. 开运算&#xff1a;5. 闭运算&#xff1a; 四、实验内容:1. 形态学图像处理用于图像边界提取2&#xff0e;数学形态学用于图像的噪点去除&#xff08;…

【2】MATLAB中strel('disk',r)的C实现

strel 是MATLAB中常用的类型&#xff0c;即是structuring element&#xff0c;用来构建结构元素。opencv中与其相似的函数是getStructuringElement()这个函数。 这里仅仅说是相似主要是因为两者还是有很多区别的。 getStructuringElement()可以获取常用的结构元素的形状&…

matlab strel详解,【2】MATLAB中strel('disk',r)的C實現

strel 是MATLAB中常用的類型&#xff0c;即是structuring element&#xff0c;用來構建結構元素。opencv中與其相似的函數是getStructuringElement()這個函數。 這里僅僅說是相似主要是因為兩者還是有很多區別的。 getStructuringElement()可以獲取常用的結構元素的形狀&#x…

matlab strel结构元素,【matlab】Strel函数--结构元素

###Date:2018.3.28 =========================================================================== Strel函数 主要用来构建形态学运算中的结构元素,使用的语法为strel(shape,parameters)。shape为形状参数,即设置什么样的结构元素;parameters为控制形状参数大小方向的参数…

Strel函数--结构元素

Strel函数 主要用来构建形态学运算中的结构元素&#xff0c;使用的语法为strel(shape,parameters)。shape为形状参数&#xff0c;即设置什么样的结构元素&#xff1b;parameters为控制形状参数大小方向的参数。 例&#xff1a; 建立一个负向45&#xff0c;长度为6的结构元素…

strel

文章目录 SyntaxDescriptionExamplesAlgorithms 形态结构要素 strel代表平坦的形态构造元素&#xff0c;这是形态扩张和侵蚀操作的重要组成部分。 平面结构元素是二维或二维的二进制值邻域&#xff0c;其中在形态计算中包含真实像素&#xff0c;而不包含错误像素。 结构元素的中…

图像处理函数——strel、roipoly、roifilt2、roifill

文章目录 1.strel2.roipoly3.roifilt24.roifill 1.strel 功能&#xff1a; 形态学结构元素&#xff0c;strel 对象表示一个平面形态学结构元素&#xff0c;该元素是形态学膨胀和腐蚀运算的重要部分。 语法&#xff1a; SE strel(shape, parameters) 创建一个结构元素对象SE。…

nginx日志配置,以及日志轮询

一、为nginx配置错误日志 Nginx错误日志是调试nginx的重要手段&#xff0c;属于核心功能模块的参数&#xff08;ngx_core_module&#xff09;该参数名字为err_log&#xff0c;是放在Main区块中全局配置 err_log的语法格式以及参数语法说明如下 err_log file lev…

nginx配置日志记录问题

去掉nginx.conf文件里面的llog_format main注释并修改为如下 log_format main $remote_addr - $remote_user [$time_local] "$request" $status $body_bytes_sent "$http_referer" "$http_user_agent" "$http_x_forwarded_for"|&quo…

nginx服务器网站日志,nginx网站日志配置

nginx网站日志配置 [2020-09-10 10:47:43] 简介: 建站服务器 1、日志介绍nginx有两种日志&#xff0c;一种是访问日志&#xff0c;一种是错误日志。访问日志中记录的是客户端对服务器的所有请求。错误日志中记录的 建站服务器 ELK系统在安装完成后需要处理相关的日志文件&…

Linux Nginx日志——Nginx日志配置 access_log error_log rewrite_log 日志轮转

1、Nginx 日志介绍 Nginx 每个级别的配置都可以有独立的访问日志, 所需日志模块 ngx_http_log_module 的支持&#xff0c;日志格式通过 log_format 命令来定义&#xff0c;日志对于统计和排错是有利的。 nginx 日志相关的配置包括 access_log、rewrite_log、error_log# 设置访…

【Nginx 日志配置】【访问日志log_format】【错误日志error_log 指令】【Nginx的日志轮转】

文章目录 Nginx 日志配置log_format 指令中常用的一些变量&#xff1a;访问日志 案例可以配置段&#xff1a;http, stream, server, location作用域。error_log 指令 错误访问日志 级别rewrite_log 指令 用户跳转日志 一般不用配置流量控制相关功能配置日志记录 Nginx 日志配置…

关于nginx日志配置指令介绍

本文主要介绍了nginx日志配置指令详解,nginx有一个非常灵活的日志记录模式,每个级别的配置可以有各自独立的访问日志,需要的朋友可以参考下 日志对于统计排错来说非常有利的。本文总结了nginx日志相关的配置如access_log、log_format、open_log_file_cache、log_not_found、lo…

宝塔自定义nginx访问日志配置

nginx日志自定义配置 问题 有时nginx默认的日志满足不了需求&#xff0c;比如网站绑定了多个域名&#xff0c;想知道用于访问的是具体域名&#xff0c;这时候就需要自定义nginx日志了。 nginx 中access log 记录了用户访问的页面以及用户浏览器、ip和其他的访问信息 log_for…

Nginx日志配置、错误界面配置、流量控制 第九天

目录 nginx日志配置 nginx日志介绍 access.log error.log open_log_file_cache rewrite.log nginx的日志轮转 nginx错误界面配置 nginx流量控制 nginx如何限流 配置基本限流 nginx流量限制&#xff08;高级&#xff09; 流量控制相关功能 nginx日志配置 nginx日志…

运维配置:Nginx日志配置详解

Nginx日志配置详解 前言 Nginx日志对于统计、系统服务排错很有用。Nginx日志主要分为两种&#xff1a;access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息&#xff0c;请求的处理时间等信息。错误日志记录了访问出错的信息&…

nginx日志[配置解释]

经常使用nginx&#xff0c;但是对nginx中的日志配置了解的不多&#xff0c;最近简单的学习了一下&#xff0c;在此简略的记录下。 nginx基础配置如下&#xff1a; user nginx; worker_processes auto;error_log /var/log/nginx/error.log notice; pid /var/run/ngi…

后端实践:Nginx日志配置(超详细)

前言 Nginx日志对于统计、系统服务排错很有用。 Nginx日志主要分为两种&#xff1a;access_log(访问日志)和error_log(错误日志)。通过访问日志我们可以得到用户的IP地址、浏览器的信息&#xff0c;请求的处理时间等信息。错误日志记录了访问出错的信息&#xff0c;可以帮助我…

Linux下玩转nginx系列(三)---nginx日志配置文件说明

nginx日志共三个参数。 access_log: 定义日志的路径及格式。 log_format: 定义日志的模板。 open_log_file_cache: 定义日志文件缓存。 nginx access日志配置 access_log日志配置 access_log用来定义日志级别&#xff0c;日志位置。语法如下&#xff1a; 日志级别&#x…