% 读取图像
img = imread('1.jpg'); % 替换成实际的图像文件名
% 图像预处理
img_gray = rgb2gray(img);
img_filtered = medfilt2(img_gray, [3, 3]); % 使用3x3的中值滤波器去除噪声
% figure();
% imshow(img_filtered)
%二值化
threshold = 21;
binaryImage = img_filtered > threshold;
% figure();
% imshow(binaryImage);
% 定义腐蚀和膨胀的结构元素
se = strel('square', 10); % 可以根据需要选择不同的结构元素
% 进行膨胀操作
dilatedImage = imdilate(binaryImage, se);
% 显示膨胀后的图像
% figure()
% imshow(dilatedImage);
% title('膨胀后的图像');
% 进行腐蚀操作
se = strel('square', 3);
erodedImage = imerode(dilatedImage, se);
% 显示腐蚀后的图像
% figure()
% imshow(erodedImage);
% title('腐蚀后的图像');
% 去除小的物体,使用面积开运算
openedImg = bwareaopen(erodedImage, 150);
figure();
imshow(openedImg);
edgeImage1 = edge(openedImg, 'canny');
% figure()
% imshow(edgeImage1)
% 去除小的物体,使用面积开运算
openedImg1 = bwareaopen(edgeImage1, 100);
% figure();
% imshow(openedImg1);
% 定义腐蚀和膨胀的结构元素
se = strel('square', 3); % 可以根据需要选择不同的结构元素
% 进行膨胀操作
dilatedImage1 = imdilate(openedImg1, se);
% 显示膨胀后的图像
% figure()
% imshow(dilatedImage1);
% 使用 regionprops 函数找到图像中的所有连通区域
stats = regionprops(openedImg, 'Centroid', 'Area');
% 设置一个合适的面积阈值来筛选实心白色半圆
area_threshold = 200; % 根据实际情况进行调整
% 提取实心白色半圆的质心
centroids = [];
for i = 1:length(stats)
if stats(i).Area > area_threshold
centroids = [centroids; stats(i).Centroid];
end
end
% 在原图上标注实心白色半圆的质心
imshow(openedImg);
hold on;
plot(centroids(:, 1), centroids(:, 2), 'r+', 'MarkerSize', 10, 'LineWidth', 2);
hold off;
% 输出质心坐标数组
disp('质心坐标数组:');
for i = 1:size(centroids, 1)
fprintf('x: %.2f, y: %.2f\n', centroids(i, 1), centroids(i, 2));
end
% 1. 查找闭合线条
boundaries = bwboundaries(dilatedImage1);
% 2. 对边界点进行聚类
min_dist = 20; % 设定边界点聚类的最小距离阈值
clusters = {};
for k = 1:length(boundaries)
boundary = boundaries{k};
if isempty(clusters)
clusters{1} = boundary;
else
added = false;
for c = 1:length(clusters)
dist = sqrt((clusters{c}(end,1) - boundary(1,1))^2 + (clusters{c}(end,2) - boundary(1,2))^2);
if dist < min_dist
clusters{c} = [clusters{c}; boundary];
added = true;
break;
end
end
if ~added
clusters{end+1} = boundary;
end
end
end
% 3. 拟合相近的边界点为一个圆
circles = [];
for c = 1:length(clusters)
cluster = clusters{c};
% 将边界点拟合成一个圆
[center, radius] = fit_circle_to_points(cluster(:, 2), cluster(:, 1));
circles(c, :) = [center, radius];
end
% 在原图上绘制拟合的圆和闭合线条的质心
figure;
imshow(img);
hold on;
all_centers = [];
for k = 1:size(circles, 1)
center = circles(k, 1:2);
radius = circles(k, 3);
radius = abs(radius); % 将r转换为非负数
viscircles(center, radius, 'EdgeColor', 'y');
% 标注圆心
text(center(1), center(2), ['C', num2str(k)], 'Color', 'red', 'FontSize', 12);
% 输出圆心坐标
disp(['圆心 C', num2str(k), ' 坐标:(', num2str(center(1)), ', ', num2str(center(2)), ')']);
disp(['半径 C', num2str(k), ': ', num2str(radius)]);
% 将圆心坐标存储到二维数组中
all_centers = [all_centers; center];
end
hold off;
% 计算 all_centers 数组与 centroids 数组中对应点之间的距离
distances = sqrt((all_centers(:, 1) - centroids(:, 1)).^2 + (all_centers(:, 2) - centroids(:, 2)).^2);
% 输出对应点之间的距离
disp('对应点之间的距离:');
for i = 1:length(distances)
fprintf('对应点 %d 的距离:%.2f\n', i, distances(i));
end
matlab医学光谱图像的,半圆光晕拟合和圆心和质心点的标记
需积分: 1 198 浏览量
2023-08-16
21:13:31
上传
评论
收藏 600KB RAR 举报
等风来1249
- 粉丝: 28
- 资源: 32
最新资源
- tensorflow-gpu-2.7.4-cp37-cp37m-manylinux2010-x86-64.whl
- 多段线、 圆、弧转多段线(仅我可见)
- tensorflow-2.7.2-cp38-cp38-manylinux2010-x86-64.whl
- yeyue-p8Yi4-ve4a83792.apk
- tensorflow-gpu-2.7.3-cp38-cp38-manylinux2010-x86-64.whl
- 五相感应电机矢量控制模型MATLAB
- RGLED (1) (1).circ
- IMG_20240427_215747.jpg
- python下前端WEB学习笔记
- 田间种植行排号自动生成工具
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈