随着计算机技术的不断发展,人们开始探索如何让计算机像人一样 “看” 和理解图像中的信息。计算机视觉作为一门交叉学科,融合了计算机科学、数学、物理学和生物学等多个领域的知识,旨在赋予计算机自动分析和理解图像内容的能力。图像处理是计算机视觉的基础,通过对图像进行各种处理操作,为后续的高级视觉任务如目标识别、场景理解等提供必要的数据预处理和特征提取。在数字媒体领域,图像是信息传播的重要载体。从早期的静态图片编辑到如今的视频流媒体处理,图像处理技术在提高图像质量、增强视觉效果以及满足用户对多媒体内容的多样化需求方面发挥着关键作用。例如,在电影制作中,图像处理技术用于特效制作、色彩校正和画面修复;在数字摄影中,它可以帮助摄影师调整照片的曝光、色彩平衡和锐度,以获得更好的视觉效果。在工业生产过程中,机器视觉系统被广泛应用于产品质量检测、零部件识别和装配操作等环节。通过图像处理技术,机器视觉系统能够快速、准确地获取产品的外观特征和尺寸信息,从而实现对产品质量的高效监控和自动化生产流程的精确控制。在机器人技术中,图像处理为机器人提供了感知周围环境的能力,使其能够识别目标物体、避开障碍物并执行各种复杂的任务。 水稻是世界主要粮食作物之一,水稻剑叶夹角对理想株型选育至关重要。传统人工测量方法效率低且易损伤作物,而机器视觉技术为作物表型信息获取提供了新途径。
本文提出一种基于图像处理的水稻剑叶夹角测量算法,通过颜色空间转换、骨架提取、Hough直线提取和K - means聚类等技术,实现夹角的实时测量,并通过实验验证了算法的准确性。原文地址
利用图像处理技术实现水稻剑叶夹角的实时、准确测量。通过智能手机采集水稻剑叶基部图像,经过一系列图像处理步骤,包括颜色空间转换、骨架提取、Hough 直线提取和 K - means 聚类等,最终计算出剑叶夹角,实现实时测量。
在这里介绍实验结果
% 进行图像分割
mask = (h_channel >= 0/255 & h_channel <= 180/255) &...
(s_channel >= 0 & s_channel <= 95/255) &...
(v_channel >= 20/255 & v_channel <= 143/255);
mask = not(mask);
% 提取分割后的图像
segmented_image = image.*repmat(uint8(mask), [1, 1, 3]);
% 灰度化处理
gray_image = rgb2gray(segmented_image);
% 二值化处理
bw_image = imbinarize(gray_image);
图中所示是实验图像的HSV直方图
morphologyEx
函数,操作类型为MORPH_OPEN
)实现。% 开运算消除白色噪点
se = strel('disk', 6); % 定义结构元素
opened_image = imopen(bw_image, se);
%骨架提取
skeleton_image = bwmorph(opened_image,'skel', Inf);
se = strel('line', 10 , 1);
% length是结构元素的长度,angle是结构元素的角度(以度为单位)
% 进行膨胀操作(可能由于骨架过细而提取不出直线)
dilated_image = imdilate(skeleton_image, se);
% Hough直线检测
[H,theta,rho] = hough(dilated_image);
peaks = houghpeaks(H, 10); % 检测10个峰值,可根据实际情况调整
lines = houghlines(dilated_image, theta, rho, peaks);
% 提取直线角度信息
line_angles = zeros(size(lines,2),1);
for i = 1:size(lines,2)
line_angles(i) = lines(i).theta;
end
Hough直线提取结果
[idx, C] = kmeans(line_angles, 2);
degree = rad × 180°/π
。theta1 = π/2 - degree
(第一象限)和theta2 = 3π/2 - degree
(第二象限)进行映射。% 角度计算
% 找到属于主茎和剑叶的直线类别(这里简单假设第一类为主茎,第二类为剑叶)
main_stem_lines = lines(idx == 1);
flag_leaf_lines = lines(idx == 2);
% 计算主茎和剑叶直线与竖直方向夹角(弧度制)
main_stem_angle_rad = mean([main_stem_lines.theta]);
flag_leaf_angle_rad = mean([flag_leaf_lines.theta]);
% 将弧度转换为角度
main_stem_angle_deg = main_stem_angle_rad * 180 / 360;
flag_leaf_angle_deg = flag_leaf_angle_rad * 180 / 360;
% 根据象限调整角度
theta1=360/2-main_stem_angle_deg;
theta2=3*360/2-main_stem_angle_deg;
theta21=360/2-flag_leaf_angle_deg;
theta22=3*360/2-flag_leaf_angle_deg;
% 计算剑叶夹角
blade_angle = abs(theta1+theta2-theta22-theta21);
disp(['剑叶夹角为:', num2str(blade_angle), '°']);
结果