使用AI进行自然场景下月季花的背景分割、面积周长计算
一、引言
随着大语言模型LLM(Large Language Model,简称LLM)的应用和推广,现在进行图像处理可以借助LLM帮助我们编写程序,我们只要输入图像并提出要求即可给我们生成程序,然后再在其生成的基础上不断修改完善即可。这样可以显著提高我们的编程效率,并提高我们分析问题的视野。
二、实例
下面我们以对一幅彩色图像背景分割和目标物的面积和周长计算为例,我们可以先在大语言模型下(如文心一言和豆包等)输入“请对彩色图像的花朵进行背景分割并进行面积和周长计算,并在红花的质心上标注面积大小”。下面给出使用文心一言和豆包进行辅助编程后并修改完善后的程序代码。
clear all;
close all;
clc;
imtool close all;
% 读取图像
img = imread('e:\pic3.jpg'); % 替换为你的图像路径
% 将图像从 RGB 颜色空间转换到 HSV 颜色空间
hsv_img = rgb2hsv(img);
imtool(hsv_img)
% 定义红色在 HSV 颜色空间中的范围
h_range1 = (hsv_img(:,:,1) >= 0) & (hsv_img(:,:,1) <= 0.1);
h_range2 = (hsv_img(:,:,1) >= 0.9) & (hsv_img(:,:,1) <= 1.0);
s_range = hsv_img(:,:,2) >= 0.3;
v_range = hsv_img(:,:,3) >= 0.3;
% 合并红色的两个色调范围,再结合饱和度和亮度范围得到红色区域的掩码
red_mask = (h_range1 | h_range2) & s_range & v_range;
% 形态学操作
se = strel('square', 5);
red_mask = imdilate(red_mask, se);
red_mask = imerode(red_mask, se);
red_mask = imfill(red_mask, 'holes');
red_mask = bwareaopen(red_mask, 3000);
% 提取红色花朵区域
red_flower = img;
red_flower = uint8(red_mask).*red_flower;
% 连通区域分析
[L, n] = bwlabel(red_mask, 8);
stats = regionprops(L, {'Area', 'Perimeter', 'Centroid'});
% 显示原始图像和提取结果
figure;
subplot(1,3,1),imshow(img),title('原始图像');
subplot(1,3,2),imshow(red_mask),title('掩模图像');
subplot(1,3,3),imshow(red_flower),title('提取的红色花朵');
% 在分割后的图像上标记面积(去除底色)
hold on; % 保持图像,以便添加文本
for i = 1:n
% 获取区域的中心坐标
centroid = stats(i).Centroid;
% 获取区域的面积
area = stats(i).Area;
% 在中心位置显示面积,字号根据面积大小调整(移除BackgroundColor参数)
text(centroid(1), centroid(2), sprintf('面积: %d', area), ...
'FontSize', 10 + round(area/5000), 'Color', 'yellow', ...
'Margin', 1);
end
hold off;
% 输出每个红色花朵区域的面积和周长
fprintf('检测到 %d 个红色花朵区域:\n', n);
for i = 1:n
fprintf('红花%d 的面积为:%f\n', i, stats(i).Area);
fprintf('红花%d 的周长为:%f\n', i, stats(i).Perimeter);
end
三、原始图像和主要运行结果
1、原始彩色图像如下图所示:
2.主要运行结果
由上面运行结果可知,在大语言模型的帮助下,可以很好的实现我们的预期效果。
撰写博客不易,如果觉的本文对大家学习和研究有所启发,请你关注、点赞,欢迎转发!
更多推荐
所有评论(0)