wulabahaaaaaaa 2023-06-06 22:44 采纳率: 50%
浏览 80
已结题

关于#matlab#的问题:要求测出上面图片中所有同心圆的半径

img


需要处理的原图片

img


要求测出上面图片中所有同心圆的半径。(能先确定圆心最好)
增加的:结果要以毫米为单位
这是处理出上面图片的代码


%-----------------------第一部分(读取)---------------------------------
%读取图片
A1=imread('51um.jpg');
figure,imshow(A1),title('原图像');
%真彩转灰度
A2=rgb2gray(A1);
figure,imshow(A2),title('灰度图');

%-----------------------第二部分(增强)---------------------------------
%直方图均衡化
B1=adapthisteq(A2); 
figure,imshow(B1),title('图像增强');

%-----------------------第三部分(降噪)---------------------------------
%均值滤波
C1= filter2(fspecial('average',7),B1)/255;%-
C2 = medfilt2(C1);                                  
%中值滤波部分
C3=medfilt2(C2,[7,7]);    %--
%低通滤波
[f1,f2] = freqspace(size(C3),'meshgrid'); %生成频率序列矩阵
Hd = ones(size(C3));   
r = sqrt(f1.^2 + f2.^2); 
Hd(r>0.5) = 0;   %构造滤波器
Y=fft2(double(C3));   
Y=fftshift(Y);   
Ya=Y.*Hd;   %滤波
Ya=ifftshift(Ya);   
C4=ifft2(Ya);
figure,imshow(C4),title('降噪');

%最大类间方差法分割图像
level=graythresh(C4);
E1=imbinarize(C4,level);             
disp(strcat('graythresh 计算灰度阈值1:',num2str(uint8(level*255))));
figure,imshow(E1),title('二值化');

%闭运算
se2=strel('disk',7);
F1=imclose(E1,se2);    

%细化
F2 = bwmorph(F1, 'thin', Inf);
figure,imshow(F2),title('ZS细化');
F3=bwmorph(F2,'spur',Inf);
F4=bwmorph(F3,'bridge');
figure,imshow(F4),title('细化后的修补');
F4=bwareaopen(F4,500);
figure,imshow(F4),title('消除无效目标');
  • 写回答

9条回答 默认 最新

  • 阳光宅男xxb 2023-06-13 08:04
    关注
    获得5.25元问题酬金

    要检测的圆的半径,首先需要确定圆的圆心。首先,将图像读入 MATLAB 中,然后,使用rgb2gray方法将图像转换为灰度图像,接着使用 MATLAB 中的函数 bwboundaries 来找到同心圆的边界,然后使用 regionprops 函数来计算每个边界的属性,包括面积、周长和中心。对于同心圆,我们需要找到中心和半径之间的关系。

    评论
  • CSDN-Ada助手 CSDN-AI 官方账号 2023-06-13 09:12
    关注
    获得6.65元问题酬金

    我可以尝试优化该MATLAB代码。首先需要明确代码中处理的图片是什么样子的,是否符合“背景单一、物体相对简单且相互分离”的条件。

    若符合条件,可以考虑使用MATLAB中的hough变换和imfindcircles函数进行圆的检测,然后利用已知的像素和实际尺寸的转换关系计算出圆的半径和圆心坐标。

    示例代码:

    % 读入图片 img = imread('example.jpg');

    % 将彩色图像转为灰度图像 gray_img = rgb2gray(img);

    % 图像预处理(根据具体情况进行调整) processed_img = imadjust(gray_img);

    % 使用Hough变换检测圆 [centers, radii, metric] = imfindcircles(processed_img, [50 600]);

    % 将圆心坐标和半径转换为实际尺寸 % 需要知道实际尺寸与像素的转换系数 conversion_factor = 0.1; % 1像素对应0.1毫米

    real_centers = centers . conversion_factor; real_radii = radii . conversion_factor;

    % 在原图上画出检测到的圆 imshow(img); viscircles(centers, radii, 'EdgeColor', 'b');

    这是一个简单的示例代码,具体需要根据实际情况进行调整。

    评论
  • GIS工具开发 2023-06-13 12:29
    关注
    获得2.80元问题酬金

    转换成灰度图,并且二值化后,进行提取

    评论
  • 会跑的小鹿 2023-06-13 12:36
    关注
    获得2.10元问题酬金

    可以使用MATLAB的图像分析函数来测量圆的半径

    评论
  • 鱼弦 全栈领域创作新星创作者 2023-06-06 23:31
    关注

    可以参考这个例子:https://zhuanlan.zhihu.com/p/635194376
    看看是否合适,合适的话,望采纳

    评论
  • 瞬间动力 2023-06-07 00:40
    关注

    这个简单的,图像二值化并已经细化了呀,这样可以根据细化后的图像求解同心圆的半径。思路看看,这样:

    1. 根据细化后的图像F4,提取连通区域信息,获取每个连通区域的包围矩形bbox。
    2. 对于每个连通区域,计算其重心坐标。
    3. 对于所有的连通区域,找到其中心距离最近的两个连通区域,它们分别对应两个同心圆的边界。对于每个同心圆,可以通过计算边界上所有点到圆心的距离,找到最大、次大等若干个距离作为半径,由此可以确定各个同心圆的半径。
      代码我先提供一个案例参考:
      (注意下:该代码将连通区域的信息存储在stats中,利用regionprops()函数可以得到连通区域的中心坐标及其包围矩形bbox等信息。对于每个连通区域,计算其到两个圆心的距离,从而定位对应的同心圆。计算同心圆的半径时,可以计算每个边界点到圆心的距离并求出最大值等作为半径大小。):
    % Label connected components
    [B, L] = bwboundaries(F4);
    stats = regionprops('table', L, 'Centroid', 'BoundingBox');
    
    center_points = stats.Centroid;
    
    % Find the two centers with closest distance
    distances = squareform(pdist(center_points));
    [sorted, idx] = sort(distances(:));
    [nearest_row, nearest_col] = ind2sub(size(distances), idx(1));
    center1 = center_points(nearest_row, :);
    center2 = center_points(nearest_col, :);
    
    % Calculate the radius of each circle
    r1 = [];
    r2 = [];
    for i = 1:length(B)
        boundary = B{i};
        % Calculate the distance from each point on boundary to center1
        dist = sqrt(sum((boundary - center1).^2, 2)); 
        % Find the maxium dist and use it as radius of circle 1
        r1 = [r1, max(dist)];
        % Do the same for circle 2
        dist = sqrt(sum((boundary - center2).^2, 2)); 
        r2 = [r2, max(dist)];
    end
    
    % Output the radius of each circle
    disp(['The radius of circle 1: ', num2str(mean(r1)), ' pixels.']);
    disp(['The radius of circle 2: ', num2str(mean(r2)), ' pixels.']);
    

    还有问题再发我好了 看能不能帮到你

    评论
  • MR_Bone 2023-06-07 10:28
    关注

    根据您提供的代码,实现了对给定图片的处理过程,包括读取图片、图像增强、降噪、图像分割、形态学操作等。然而,根据代码内容,无法直接确定同心圆的半径和圆心坐标。为了测量同心圆的半径,需要进行进一步的处理。

    以下是一个可能的处理方法:

    1. 根据处理后的二值化图像F4,使用OpenCV的findContours函数找到图像中的所有轮廓。
    2. 对于每个轮廓,可以使用minEnclosingCircle函数找到其外接圆。
    3. 根据外接圆的半径大小,可以对同心圆进行分组,并计算每组同心圆的平均半径,从而获得同心圆的半径和圆心坐标。

    需要注意的是,以上方法仅适用于图像中的同心圆较为清晰且没有重叠的情况。对于较为复杂的图像,可能需要更复杂的算法或人工干预来处理。

    请注意,上述处理方法涉及使用OpenCV等库进行图像处理,您需要在代码中添加相应的函数和库调用来实现该处理方法。

    评论
  • HiSiri666666 Java领域优质创作者 2023-06-07 12:44
    关注
    1. 读取图像并转换为灰度图像:
    img = imread('image.jpg');
    gray = rgb2gray(img);
    
    
    1. 对灰度图像进行二值化处理:
    bw = imbinarize(gray);
    
    
    1. 使用Hough变换检测圆形:
    [centers, radii] = imfindcircles(bw, [10 100]);
    
    

    其中,第二个参数[10 100]表示检测半径范围为10到100个像素。

    1. 绘制检测到的圆形:
    viscircles(centers, radii, 'EdgeColor', 'b');
    
    

    其中,'EdgeColor'参数指定圆形边缘的颜色为蓝色。

    1. 输出检测到的圆形半径:
      disp(radii);
      完整的代码如下:
    img = imread('image.jpg');
    gray = rgb2gray(img);
    bw = imbinarize(gray);
    [centers, radii] = imfindcircles(bw, [10 100]);
    viscircles(centers, radii, 'EdgeColor', 'b');
    disp(radii);
    
    

    注意,这个方法仅适用于所有圆形都是同心圆的情况。如果存在不同中心的圆形,则需要使用更复杂的算法进行检测。

    评论
  • yy64ll826 2023-06-12 17:26
    关注

    可以参考下

    >> x=linspace(0,2*pi,60);
    >> subplot(2,2,1)         % 指定两行两列绘图区的第一个图形为活动区
    >> plot(x,sin(x)-1);
    >> title('sin(x)-1');
    >> axis ([0,2*pi,-2,0])  
    >> subplot(2,1,2)         % 指定两行一列绘图区的第二个图形为活动区
    >> plot(x,cos(x)+1);
    >> title('cos(x)+1');
    >> axis ([0,2*pi,0,2])
    >> subplot(4,4,3) 
    >> plot(x,tan(x));
    >> title('tan(x)');
    >> axis ([0,2*pi,-40,40])
    >> subplot(4,4,8) 
    >> plot(x,cot(x));
    >> title('cot(x)');
    >> axis ([0,2*pi,-35,35])
    
    
    
    评论

报告相同问题?

问题事件

  • 系统已结题 6月14日
  • 修改了问题 6月7日
  • 赞助了问题酬金15元 6月7日
  • 修改了问题 6月7日
  • 展开全部

悬赏问题

  • ¥15 C语言用正向迭代,反向迭代解决问题
  • ¥15 想要卸载软件(maltab)但是在控制面板的程序和功能中没有要卸载的软件怎么办?
  • ¥15 关于sp验证的一些东西,求告知如何解决,
  • ¥20 关于#javascript#的问题:但是我写的只能接码数字和字符,帮我写一个解码JS问题
  • ¥15 prophet运行报错,如何解决?
  • ¥15 用GPU跑pytorch搭建的LSTM的时候出现了奇怪的报错
  • ¥20 前端数据是从session等作用域拿到的,如何取值继续传递后端呢
  • ¥15 eclipse无法正常运行
  • ¥15 定义了函数,但是无法根据函数定义触发器
  • ¥20 5变量卡诺图化简得出与非门电路图