红苹果的圆度、直径大小标定

function fruitImageProcessingGUI% 创建主窗口和控件mainFigure = figure('Units', 'normalized', 'Position', [0.3, 0.3, 0.4, 0.4]);instructionText = uicontrol('Style', 'text', 'String', '请点击按钮执行相应的图像处理步骤', ...'Units', 'normalized', 'Position', [0.1, 0.7, 0.8, 0.2], 'FontSize', 12);readImageBtn = uicontrol('Style', 'pushbutton', 'String', '读取图像', ...'Units', 'normalized', 'Position', [0.2, 0.4, 0.6, 0.1], 'FontSize', 12, ...'Callback', @readImageBtn_Callback);thresholdBtn = uicontrol('Style', 'pushbutton', 'String', '阈值化', ...'Units', 'normalized', 'Position', [0.2, 0.3, 0.6, 0.1], 'FontSize', 12, ...'Enable', 'off', 'Callback', @thresholdBtn_Callback);% 在这里继续添加其他按钮和控件% 存储GUI数据的结构体handles = struct();% 读取图像按钮的回调函数function readImageBtn_Callback(~, ~)% 读取图像rgb = imread('fruit.jpg');[m, n, d] = size(rgb);% 更新说明文本框set(instructionText, 'String', '图像已读取');% 将图像保存到GUI数据中,以便其他按钮功能使用handles.rgb = rgb;handles.m = m;handles.n = n;handles.d = d;% 启用下一个按钮set(thresholdBtn, 'Enable', 'on');% 更新GUI数据guidata(mainFigure, handles);end% 阈值化按钮的回调函数function thresholdBtn_Callback(~, ~)% 获取GUI数据中的图像和尺寸信息rgb = handles.rgb;m = handles.m;n = handles.n;d = handles.d;% 阈值设置level1 = [255 * 0.2, 255 * 0.3];% 转换数据类型,图像输出类型只能是uint型rgb = uint8(rgb);% 剔除r-g < level1(1), r-g < level1(2)的部分r = rgb;for i = 1:mfor j = 1:nif (rgb(i, j, 1) - rgb(i, j, 2)) < level1(1) && (rgb(i, j, 1) - rgb(i, j, 3)) < level1(2)r(i, j, 1) = 0;r(i, j, 2) = 0;r(i, j, 3) = 0;endendend% 更新说明文本框set(instructionText, 'String', '图像阈值化完成');% 在此处可以添加显示阈值化后的图像的代码,例如使用imshow函数显示r% 更新GUI数据handles.rgb = r;guidata(mainFigure, handles);end% 在这里继续添加其他按钮的回调函数end
function imageSegmentationGUI()% 创建GUI窗口fig = figure('Name', '目标与背景的分割与提取', 'NumberTitle', 'off', 'Position', [200, 200, 900, 600]);% 创建UI组件btnSelectImage = uicontrol('Style', 'pushbutton', 'String', '选择图像', 'Position', [50, 500, 100, 30], 'Callback', @selectImage);btnMeanFilter = uicontrol('Style', 'pushbutton', 'String', '均值滤波', 'Position', [50, 450, 100, 30], 'Callback', @applyMeanFilter);btnThresholding = uicontrol('Style', 'pushbutton', 'String', '二值图像', 'Position', [50, 400, 100, 30], 'Callback', @applyThresholding);btnOpening = uicontrol('Style', 'pushbutton', 'String', '开启运算', 'Position', [50, 350, 100, 30], 'Callback', @applyOpening);btnClosing = uicontrol('Style', 'pushbutton', 'String', '闭合运算', 'Position', [50, 300, 100, 30], 'Callback', @applyClosing);btnEdgeDetection = uicontrol('Style', 'pushbutton', 'String', '提取边缘', 'Position', [50, 250, 100, 30], 'Callback', @applyEdgeDetection);btnShowResult = uicontrol('Style', 'pushbutton', 'String', '显示结果', 'Position', [50, 200, 100, 30], 'Callback', @showResult);btnSegmentation = uicontrol('Style', 'pushbutton', 'String', '分割图像', 'Position', [50, 150, 100, 30], 'Callback', @performSegmentation);btnExit = uicontrol('Style', 'pushbutton', 'String', '退出', 'Position', [50, 100, 100, 30], 'Callback', @exitGUI);axesHandle1 = axes('Parent', fig, 'Position', [0.3, 0.1, 0.6, 0.8]);% 全局变量rgb = [];r=[];grayImage = [];thresholdedImage = [];openedImage = [];closedImage = [];edgeImage = [];resultImage = [];% 图像处理函数function selectImage(~, ~)[fileName, pathName] = uigetfile({'*.jpg;*.png;*.bmp', '图像文件 (*.jpg, *.png, *.bmp)'}, '选择图像');if isequal(fileName, 0) || isequal(pathName, 0)return;end% 读取图像rgb = imread(fullfile(pathName, fileName));% 显示原图像imshow(rgb, 'Parent', axesHandle1);endfunction applyMeanFilter(~, ~)if isempty(rgb)errordlg('请先选择图像!', '错误');return;end% 均值滤波r2=rgb;grayImage = rgb2gray(r2);n = 3;template = ones(n) / (n * n);filteredImage = imfilter(double(grayImage), template, 'replicate');% 显示均值滤波后的图像imshow(filteredImage, 'Parent', axesHandle1);endfunction applyThresholding(~, ~)if isempty(grayImage)errordlg('请先进行均值滤波!', '错误');return;end% 二值图像threshold = graythresh(grayImage);thresholdedImage = imbinarize(grayImage, threshold);% 显示二值图像imshow(thresholdedImage, 'Parent', axesHandle1);endfunction applyOpening(~, ~)if isempty(thresholdedImage)errordlg('请先进行二值图像处理!', '错误');return;end% 开启运算se = strel('disk', 12);openedImage = imopen(thresholdedImage, se);% 显示开启运算后的图像imshow(openedImage, 'Parent', axesHandle1);endfunction applyClosing(~, ~)if isempty(openedImage)errordlg('请先进行开启运算!', '错误');return;end% 闭合运算se = strel('disk', 5);closedImage = imclose(openedImage, se);% 显示闭合运算后的图像imshow(closedImage, 'Parent', axesHandle1);endfunction applyEdgeDetection(~, ~)if isempty(closedImage)errordlg('请先进行闭合运算!', '错误');return;end% 提取边缘edgeImage = edge(closedImage, 'canny');% 显示边缘图像imshow(edgeImage, 'Parent', axesHandle1);endfunction showResult(~, ~)if isempty(edgeImage)errordlg('请先进行边缘提取!', '错误');return;end% 分割完成的图像resultImage = edgeImage; % 这里将边缘图像作为分割结果,您可以根据需要修改这部分代码% 显示分割结果imshow(resultImage, 'Parent', axesHandle1);endfunction performSegmentation(~, ~)if isempty(rgb)errordlg('请先选择图像!', '错误');return;end% 在这里执行分割任务% 根据您的代码进行相应的处理% ...% 显示分割结果resultImage = rgb; % 这里将原图像作为分割结果,您可以根据需要修改这部分代码% 显示分割结果imshow(resultImage, 'Parent', axesHandle1);endfunction exitGUI(~, ~)choice = questdlg('确定要退出吗?', '退出', '是', '取消', '取消');if strcmp(choice, '是')close(fig);endend
end

GUI界面设计如下
在这里插入图片描述
实现目标与背景的分割和提取

clear
clc
close allh = 0.002; % 步长
x1 = 100;
x0 = 0:h:x1;
y0 = [2; 2; 2; 2]; % 初始条件,对应 x, y, z, w
% 不同的 c
c = 1:1:500;
N_c = length(c);
N_P = 300; % 假设穿过截面的共有 300 个点
BF = nan(N_c, N_P);
for k = 1:N_cc_k = c(k);disp(c_k)% 计算轨迹[y1, ~] = ODE_RK4_hyh(0:10*h:x1, 10*h, y0, [c_k, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]); % 先粗略的计算前几步,然后排除初始点的影响,舍弃不要[y1, ~] = ODE_RK4_hyh(x0 + x1, h, y1(:, end), [c_k, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1, 0.1]);% 计算 Poincare 平面Plane = [1; -1; 0; 0]; % x - y = 0 平面 (正方向)[tP_List, yP_List] = Solve_Poincare(x0, y1, Plane); % 计算 Poincare 平面% 对于混沌系统再加一条,如果系统稳定了,则将稳定点也记录在最终分岔图内:if isempty(tP_List) && abs(y1(1, end) - y1(2, end)) < 1e-2 % 如果最后 x 和 y 足够接近,则认为收敛了tP_List = x0(end - 1:end);yP_List = y1(:, end - 1:end);end% 储存 y 值作为待会分岔图的点N_P_temp = size(tP_List, 2);if N_P_temp > N_PBF(k, 1:N_P) = yP_List(2, 1:N_P);elseBF(k, 1:N_P_temp) = yP_List(2, 1:N_P_temp);end
end% 绘制分岔图
figure()
hold on
for k = 1:N_Pc_k = c(k);plot(c_k * ones(1, N_P), BF(k, 1:N_P), ...'LineStyle', 'none', 'Marker', '.', 'MarkerFaceColor', 'k', 'MarkerEdgeColor', 'k', ...'MarkerSize', 1)
end
hold offfunction [tP_List, yP_List] = Solve_Poincare(t, y, Plane)% 截面方程 z = 0% Plane = [0; 0; 1; 0]; % 一般情况下是个垂直某个轴的平面% 一般只记录从负到正穿越。如果想反向也记录,可以设置 Plane = -Plane.% 第二步,插值得到线与面的交点yP_List = [];tP_List = [];Dis = DistancePlane(y, Plane);N = size(y, 2);for k = 1:N - 1if Dis(k) <= 0 && Dis(k + 1) > 0t0 = t(k);t1 = t(k + 1);yP0 = y(:, k);yP1 = y(:, k + 1);Dis0 = Dis(k);Dis1 = Dis(k + 1);% 一维线性插值,求 Dis = 0 时的 t 和 yyP = yP0 + (yP1 - yP0) / (Dis1 - Dis0) * (0 - Dis0);tP = t0 + (t1 - t0) / (Dis1 - Dis0) * (0 - Dis0);% 储存yP_List = [yP_List, yP];tP_List = [tP_List, tP];endend
end% 点到平面的距离
function Dis = DistancePlane(xk, Plane)% xk,坐标点,如果是 3 维坐标,大小就是 3*N 的矩阵。% Plane,平面,形如 Ax + By + Cz + D = 0 形式的平面。N = size(xk, 2); % 计算总共多少个点xk2 = [xk; ones(1, N)];Dis = dot(xk2, Plane * ones(1, N), 1) / norm(Plane(1:end - 1));
endfunction [F, Output] = Fdydx(x, y, Input)% 形式为 Y' = F(x, Y) 的方程,参见数值分析求解常系数微分方程相关知识% 高次用列向量表示,F = [dy(1); dy(2)]; y(1) 为函数,y(2) 为函数导数% 给定混沌系统的微分方程a = Input(1);b = Input(2);c = Input(3);d = Input(4);e = Input(5);f = Input(6);g = Input(7);h = Input(8);dxdt = a * y(3) * y(2) + c * y(4) * cos(y(2));dydt = -y(1) * y(3) + b * y(2) + e * y(1) + f * y(2);dzdt = y(1) * y(2) - c * y(3) + f * y(3);dwdt = y(2) * y(3) - d * y(4) + g * y(1) * cos(y(2)) + h * y(2) * sin(y(3));F = [dxdt; dydt; dzdt; dwdt];Output = [];
endfunction [y, Output] = ODE_RK4_hyh(x, h, y0, Input)% 4阶RK方法% h 间隔为常数的算法y = zeros(size(y0, 1), size(x, 2));y(:, 1) = y0;for ii = 1:length(x) - 1yn = y(:, ii);xn = x(ii);[K1, ~] = Fdydx(xn, yn, Input);[K2, ~] = Fdydx(xn + h / 2, yn + h / 2 * K1, Input);[K3, ~] = Fdydx(xn + h / 2, yn + h / 2 * K2, Input);[K4, ~] = Fdydx(xn + h, yn + h * K3, Input);y(:, ii + 1) = yn + h / 6 * (K1 + 2 * K2 + 2 * K3 + K4);endOutput = [];
end

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述 使用matlab对图像进行去噪处理、对彩色图像 进行目标和背景分析,通过阈值法将图像进行分割,提取特征参数,并对圆度和直径进行标定。使用均值滤波等一系列方法实现了对苹果的分割提取以及特征参数的标定。但是本次设计存在不足之处,对于重叠区域的分割与提取暂未处理好。
[1]陈贝文,陈淦.水果分类识别与成熟度检测技术综述[J].计算机时代,2022(07):62-65.DOI:10.16644/j.cnki.cn33-1094/tp.2022.07.016.
[2]王运祥,马本学,贾艳婷等.采用夹持果梗方法的水果检测分级机设计[J].食品与机械,2015,31(05):107-110.DOI:10.13652/j.issn.1003-5788.2015.05.027.
[3]苗玉彬,王浙明,刘秦.水果轮廓特征提取的Zernike矩分水岭分割方法[J].农业工程学报,2013,29(01):158-163.
[4]应义斌.水果图像的背景分割和边缘检测技术研究[J].浙江大学学报(农业与生命科学版),2000(01):37-40.
[5]徐琳,吕宇玲,王晓娟.水果的分割算法研究[J].数字通信世界,2018(05):274-275.
[6]苗玉彬,王浙明,刘秦.水果轮廓特征提取的Zernike矩分水岭分割方法[J].农业工程学报,2013,29(01):158-163.

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/18674.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

母亲的爱与妻子的爱,同为“爱“。不同感受!

母亲的爱与妻子的爱&#xff0c;虽然都是一个女人给予男人的爱&#xff0c;却有着本质的不同&#xff01; 天下父母对儿女的爱大多相同。在母亲眼中&#xff0c;儿女无论是多大年龄&#xff0c;无论你是否长大成人&#xff0c;也无论你做多大的官&#xff0c;有多么大的成就&am…

HBuilderX新增uni-app项目并发布到微信小程序

目录 1、下载软件并安装 2、创建项目并配置小程序id 3、微信开发者工具运行项目并配置 4、开发一个登录页面并发布 5、上传代码并小程序打开 6、手机扫码查看小程序 7、体验完后还要发版要去小程序申请备案认证 1、下载软件并安装 下载HBuilderX 下载微信开发者工具 …

【Java SE】超详细讲解String类

&#x1f970;&#x1f970;&#x1f970;来都来了&#xff0c;不妨点个关注叭&#xff01; &#x1f449;博客主页&#xff1a;欢迎各位大佬!&#x1f448; 文章目录 1. 初步认识String2. String类的常用方法2.1 字符串构造2.2 String对象比较2.2.1 比较是否引用同一个对象2.2…

【Pandas】深入解析`pd.read_json()`函数

【Pandas】深入解析pd.read_json()函数 &#x1f308; 欢迎莅临我的个人主页&#x1f448;这里是我深耕Python编程、机器学习和自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;并乐于分享知识与经验的小天地&#xff01;&#x1f387; &#x1f393; 博主简介&#x…

unity开发Hololens,使用unity自带的UGUI

hololens 使用UGUI 新建画布&#xff0c;添加组件&#xff0c; 画布模式改成WorldSpace&#xff0c;这样在能在3D场景里 随意的移动位置&#xff0c; 添加NearIteractionTouchaBleUnityUI、CanvasUtility组件 EaventsToReceive改成Pointer&#xff0c; 这样&#xff0c;UGUI的…

TC3xx分析--如何提高系统运行效率(2)

目录 1.概述 2.限定符对于代码的影响 3.小结 1.概述 上文TC3xx分析--如何提高系统运行效率(1)-CSDN博客讲解了Tasking中lsl的某些关键定义&#xff0c;简述了Tricore寻址模式&#xff0c;接下来我们继续看&#xff0c;不同memory限定符对于代码的影响。 2.限定符对于代码的…

振弦式位移计在各类工程中的应用

振弦式位移计&#xff0c;作为一种高精度、高可靠性的测量工具&#xff0c;在各类工程中发挥着至关重要的作用。它通过测量弦的振动频率来间接得出结构的位移变化&#xff0c;为工程师和科学家们提供了精确的数据支持&#xff0c;从而确保工程的安全性和稳定性。 点击输入图片描…

ASTRONEER异星探险家服务器开服多人联机

1、购买后登录服务器 进入控制面板后会出现正在安装的界面&#xff0c;安装大约5分钟&#xff08;如长时间处于安装中请联系我们的客服人员&#xff09; 2、获取数字IP地址 使用IP 地址查询网站将服务器IP地址填入后点击查询&#xff08;查询的时候将地址冒号后方的数字以及冒…

五种不寻常的身份验证绕过技术

身份验证绕过漏洞是现代web应用程序中普遍存在的漏洞&#xff0c;也是隐藏最深很难被发现的漏洞。 为此安全防护人员不断在开发新的认证方法&#xff0c;保障组织的网络安全。尽管单点登录(SSO)等工具通常是对旧的登录用户方式的改进&#xff0c;但这些技术仍然可能包含严重的…

Java 阻塞队列与生产者消费者模型

一、阻塞队列 阻塞队列是⼀种特殊的队列&#xff0c;其也遵守队列 "先进先出" 的原则&#xff1b; 阻塞队列是⼀种线程安全的数据结构&#xff0c;并且具有以下特性&#xff1a; 当队列满的时候&#xff0c;继续入队列就会阻塞&#xff0c;直到有其他线程从队列中…

JWT身份验证相关安全问题

前言&#xff1a;工作中需要基于框架开发一个贴近实际的应用&#xff0c;找到一款比较合适的cms框架&#xff0c;其中正好用到的就是jwt做身份信息验证&#xff0c;也记录一下学习jwt相关的安全问题过程。 JWT介绍 Json web token (JWT), 是为了在网络应用环境间传递声明而执行…

如何遍历并处理不平衡的Python数据集

目录 一、引言 二、不平衡数据集的概念与影响 三、处理不平衡数据集的策略 重采样策略 集成学习方法 代价敏感学习 一分类方法 四、Python工具与库 五、案例分析与代码实现 案例一&#xff1a;使用imbalanced-learn库进行上采样 案例二&#xff1a;使用scikit-learn…

基于L1范数惩罚的稀疏正则化最小二乘心电信号降噪方法(Matlab R2021B)

L1范数正则化方法与Tikhonov正则化方法的最大差异在于采用L1范数正则化通常会得到一个稀疏向量&#xff0c;它的非零系数相对较少&#xff0c;而Tikhonov正则化方法的解通常具有所有的非零系数。即&#xff1a;L2范数正则化方法的解通常是非稀疏的&#xff0c;并且解的结果在一…

vue 笔记02

目录 01 事件修饰符 02 按键修饰符 03 v-bind属性 04 vue-axios的基本使用 05 vue的生命周期 06 vue生命周期涉及到的其他的知识点 01 事件修饰符 vue的事件修饰符 事件名称.修饰符1.修饰符2...事件驱动函数 stop 阻止冒泡修饰符 prevent 阻止默认行为 once 当前事件只触…

【信息学奥赛】字典的键和值对换

【信息学奥赛】字典的键和值对换 &#x1f496;The Begin&#x1f496;点点关注&#xff0c;收藏不迷路&#x1f496; 输入一个字典&#xff0c;要求将该字典的键和值对换。&#xff08;注意&#xff0c;字典中有键的值是重复的&#xff09; 输入&#xff1a; 一行&#xff0…

信息系统项目管理师0137:输出(8项目整合管理—8.9结束项目或阶段—8.9.3输出)

点击查看专栏目录 文章目录 8.9.3 输出8.9.3 输出 项目文件(更新)可在结束项目或阶段更新所有项目文件,并标记为最终版本。特别值得注意的是,经验教训登记册的最终版本要包含阶段或项目收尾的最终信息。最终版本的经验教训登记册可包含:效益管理、项目评估的准确性、项目和…

修改vuetify3的开关组件v-switch在inset模式下的大小

<v-switchv-model"model":label"Switch: ${model.toString()}"hide-detailsinset></v-switch>使用方式1&#xff1a;本页面使用 本页面中使用&#xff0c;必须要含有lang“scss” scoped&#xff0c;才会生效 <style lang"scss"…

基础漏洞系列——CSRF跨站请求伪造

简介&#xff1a; 跨站请求伪造&#xff08;英语&#xff1a;Cross-site request forgery&#xff09;&#xff0c;也被称为 one-click attack或者 session riding&#xff0c;通常缩写为 CSRF或者 XSRF&#xff0c; 是一种挟制用户在当前已登录的Web应用程序上执行非本意的操…

【会议征稿,JPCS出版】2024年航空航天与力学国际学术会议(ICAM 2024)

2024年航空航天与力学国际学术会议&#xff08;ICAM 2024&#xff09;将于2024年7月12-14日在中国沈阳举办。会议由东北大学机械工程与自动化学院主办&#xff0c;吉林大学机械与航空航天工程学院承办&#xff0c;大连理工大学、沈阳航空航天大学、沈阳建筑大学、沈阳工业大学、…

适合源代码的加密系统

在信息化高度发展的今天&#xff0c;源代码的安全问题日益受到重视。源代码是企业或组织的核心资产&#xff0c;一旦泄露或被篡改&#xff0c;将会对其造成巨大的经济损失和声誉风险。因此&#xff0c;如何有效防止源代码的泄露和算改成为了企业和组织急需解决的问题。沙盒技术…