既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
目录
2.实战项目一:利用imfindcircles()函数检测和测量图像中的圆形目标
1.基本图像导入、处理和导出
Basic Image Import, Processing, and Export- MATLAB & SimulinkThis example shows how to read an image into the workspace, adjust the contrast in the image, and then write the adjusted image to a file.https://www.mathworks.com/help/releases/R2021b/images/image-import-and-export.html以下是输入的缺陷检测图片1.jpg(左),和经过histeq(直方图均衡使强度值扩展分布到了图像的完整范围内)函数提高对比度的2.jpg(右)。
I = imread("1.jpg");
whos I % 使用 whos 命令,检查 imread 函数如何在工作区中存储图像数据。
% 调用 imhist 函数创建直方图。
% 请在调用 imhist 之前使用 figure 命令,这样直方图就不会覆盖当前图窗窗口中显示的图像 I。
imhist(I)
I2 = histeq(I); % 使用 histeq 函数提高图像的对比度
imshow(I2)
imwrite(I2, '2.jpg'); % 使用 imwrite 函数,将刚刚经过调整的图像 I2 写入磁盘文件
imfinfo('2.jpg') % imfinfo 函数返回文件中图像的相关信息
2.实战项目一:利用imfindcircles()函数检测和测量图像中的圆形目标
Detect and Measure Circular Objects in an Image- MATLAB & Simulink ExampleThis example shows how to automatically detect circular objects in an image and visualize the detected circles.https://www.mathworks.com/help/releases/R2021b/images/detect-and-measure-circular-objects-in-an-image.htmlimfindcircles()使用基于圆形 Hough 变换 (CHT) 的算法在图像中寻找圆形。之所以使用这种方法,是因为当存在噪声、遮挡和变化的光照条件时该方法表现稳健。
有关imfindcircles()的详细信息,请参阅帮助文档:
rgb = imread('coloredChips.png');
imshow(rgb)
% 此段代码是为了清楚对象是比背景亮还是比背景暗,输出灰度图片看一看
% gray_image = rgb2gray(rgb);
% imshow(gray_image)
% 此段代码用来确定imfindcircles函数里的radiusRange,测出来应该是[25 30]
% d = drawline; % 画一条线,大致画出圆的直径
% pos = d.Position % 线的位置
% diffPos = diff(pos); % 各行之间的一阶差分,也就是delta x和delta y
% diameter = hypot(diffPos(1),diffPos(2)) % 平方和的平方根(斜边)
% 这里开始找圆,用的是imfindcircles()函数
% 背景相当亮,大多数塑料片比背景暗,将参数 'ObjectPolarity' 设置为 'dark' 以搜索较暗的圆。
% imfindcircles 有两种不同寻找圆的方法:默认方法(称为相位编码方法)/两阶段方法,这里指定使用两阶段方法
% 两种方法都能准确找到部分可见(遮挡)塑料片的中心和半径。
[centers,radii] = imfindcircles(rgb,[25 30],'ObjectPolarity','dark', ...
'Sensitivity',0.92,'Method','twostage');
% 注意到黄色圆都没有被检测到
% 与背景相比,黄色塑料片的强度几乎相同,甚至更亮。因此,要检测黄色塑料片,'ObjectPolarity' 改为 'bright'。
% [centersBright,radiiBright] = imfindcircles(rgb,[25 30], ...
% 'ObjectPolarity','bright','Sensitivity',0.95)
% 找到了三个原先未检测到的黄色塑料片,但仍有黄色塑料片未检测到
% 要查找圆,imfindcircles 仅使用图像中的边缘像素。这些边缘像素基本上是具有高梯度值的像素。
% 'EdgeThreshold' 参数控制像素的梯度值必须有多高,才能将其视为边缘像素并包含在计算中。
% 该参数的高值(更接近 1)只允许包含强边缘(较高梯度值),而低值(更接近 0)的宽容度更高,可在计算中包含较弱的边缘(较低梯度值)。
% 对于检测不到黄色塑料片的情况,是因为对比度低,一些边界像素(在塑料片的圆周上)预期具有低梯度值。因此,请降低 'EdgeThreshold'。
[centersBright,radiiBright,metricBright] = imfindcircles(rgb,[25 30], ...
'ObjectPolarity','bright','Sensitivity',0.95,'EdgeThreshold',0.1);
imshow(rgb)
hBright = viscircles(centersBright, radiiBright,'Color','b'); % 蓝色画出
h = viscircles(centers,radii); % 红色画出
3.实战项目二:图像增强(预处理)统计米粒
本案例说明如何在分析前的预处理步骤增强图像。例如校正背景亮度不均匀问题,并将图像转换为二值图像,以便于识别前景对象(单个米粒)。然后分析对象,例如计算每粒大米的面积,并计算图像中所有对象的统计量。
关于形态学图像处理的知识(strel腐蚀和imopen形态学开操作),可参考冈萨雷斯的数字图像处理第9章和以下资料:
形态学运算与仿真:图像处理中形态学操作的简单解释 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/628780157
简而言之,形态学运算包括膨胀、腐蚀、开运算、闭运算等。其中:
- 膨胀操作可以将图像中的物体变大,使它更加连通;
- 腐蚀操作则可以将图像中的物体变小,使它更加细化;
- 开运算可以去除噪声,平滑图像的边缘;
- 闭运算可以填补图像中物体的孔洞。
这里应用strel腐蚀和imopen形态学开操作,目的是得到背景。
经过预处理得到图像的二值版本,然后利用bwconncomp()在二值图像中查找所有连通分量(对象)得到所有米粒的信息。最后展示了经过预处理后的图片和米粒面积的直方图:
I = imread('rice.png');
% imshow(I)
% strel 对象表示一个平面形态学结构元素,该元素是形态学膨胀和腐蚀运算的重要部分。
se = strel('disk',15);
% 开操作Open先对图像进行腐蚀操作,然后再进行膨胀操作的组合过程,可以用于消除小的物体或细节,并且可以平滑物体的边界
% 闭操作Close则相反,它是先对图像进行膨胀操作,然后再进行腐蚀操作的组合过程。可以用于填补小的空洞或裂缝,并且也可以平滑物体的边界。
% imopen执行形态学开操作,然后得到背景
background = imopen(I,se);
% imshow(background)
I2 = I - background;
% 默认情况下,imadjust 对所有像素值中最低的 1% 和最高的 1% 进行饱和处理。此运算可提高输出图像的对比度。
I3 = imadjust(I2);
bw = imbinarize(I3); % 使用 imbinarize 函数将灰度图像转换为二值图像
bw = bwareaopen(bw,50); % 使用 bwareaopen 函数去除图像中的背景噪声。
cc = bwconncomp(bw,4); % bwconncomp查找二值图像中的连通分量
% cc.NumObjects
labeled = labelmatrix(cc); % 使用 labelmatrix 根据 bwconncomp 的输出创建标签矩阵,将二进制图像中的连通分量标记为唯一的整数值。使用标签矩阵可视化不同的连通分量。
RGB_label = label2rgb(labeled,'spring','c','shuffle'); % 为了更容易区分不同的连通分量,使用label2rgb将标签矩阵显示为RGB图像,并对标签的颜色随机。
% imshow(RGB_label)
graindata = regionprops(cc,'basic'); % regionprops返回二值图像中每个8连通分量(对象)的属性集的测量值。
grain_areas = [graindata.Area];
histogram(grain_areas)
title('Histogram of Rice Grain Area')
4.实战项目三:利用Sobel算子进行裂纹检测
Sobel算子实现步骤:
1.首先需要两个方向(水平和竖直方向)的滤波核:
这是因为边缘检测的目的是标识数字图像中亮度变化明显的点。图像属性中的显著变化通常反映了属性的重要事件和变化。所以通常说来图像中梯度较大的点代表着边缘。边缘检测方法分为两类:
- 基于搜索:利用一阶导数最大值检测边缘。通过寻找图像一阶导数中的最大值来检测边界,然后利用计算结果估计边缘的局部方向,代表算法是Sobel算子和Scharr算子。这是因为边缘附近的像素值会有明显突变,即变化最大,也就是一阶导数最大(实际操作中通常设置一个阈值)。那么找到最大的一阶导数也就找到了像素变化最大的点,即边缘点。
- 基于零穿越:利用二阶导数为0检测边缘。代表算法是Laplace算子。因为在一阶导数的基础上再求一次导,那么此时零点就是变化最大的点,即边缘点。
导数定义:
对于不连续的函数,一阶导数(一阶均差)可以写作:
所以有:,也就是后-前。
因此我们有:
x方向的梯度:拿后一列(下标j+1)减去前一列(下标j-1):
y方向的梯度:拿后一行(下标i+1)减去前一行(下标i-1):
写成卷积表达式就是:
梯度:
为计算方便起见,通常:
以上卷积核称为Prewitt算子。现在我们在计算梯度时引入加权平均,就构成了Sobel算子和Schar算子:
Sobel算子提高了4邻域的权重:
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新
)]
[外链图片转存中…(img-BoNIDB4O-1715767401111)]
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上大数据知识点,真正体系化!
由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新