2

我想在图像中拉伸一个椭圆对象,直到它形成一个圆圈。我的程序当前输入一个带有椭圆物体(例如,硬币在一个角度)的图像,对其进行阈值化和二值化,使用边缘检测/bwboundaries() 隔离感兴趣的区域,并执行 regionprops() 来计算长轴/短轴长度.

本质上,我想使用“MajorAxisLength”作为直径并在短轴上拉伸对象以形成一个圆。任何关于我应该如何解决这个问题的建议将不胜感激。我已经附加了一些代码供您阅读(不幸的是,我没有足够的声誉来上传图像,二值化图像看起来像黑色背景上的白色椭圆)。

编辑:我还想将此技术应用于图像的灰度版本,以检查拉伸的样子。

代码片段:

rgbImage = imread(fullFileName);
redChannel = rgbImage(:, :, 1);
binaryImage = redChannel < 90;
labeledImage = bwlabel(binaryImage);
area_measurements = regionprops(labeledImage,'Area');
allAreas = [area_measurements.Area];
biggestBlobIndex = find(allAreas == max(allAreas));
keeperBlobsImage = ismember(labeledImage, biggestBlobIndex);
measurements = regionprops(keeperBlobsImage,'Area','MajorAxisLength','MinorAxisLength')
4

2 回答 2

1

您知道圆的直径,并且您知道圆心是长轴和短轴相交的位置。因此,只需根据直径计算半径r,对于图像中的每个像素,检查该像素与圆心的欧几里得距离是否小于r. 如果是这样,请将像素着色为白色。否则,别管它。

[M,N] = size(redChannel);
new_image = zeros(M,N);
for ii=1:M
    for jj=1:N
        if( sqrt((jj-center_x)^2 + (ii-center_y)^2) <= radius )
            new_image(ii,jj) = 1.0;
        end
    end
end

这可以通过使用 meshgrid 函数结合逻辑索引来优化以避免循环。

于 2012-04-07T04:42:48.380 回答
0

多亏了 matlab 论坛上的大量帮助,我终于设法弄清楚了所需的转换。我想我会把它贴在这里,以防其他人需要它。

    stats = regionprops(keeperBlobsImage, 'MajorAxisLength','MinorAxisLength','Centroid','Orientation');
    alpha = pi/180 * stats(1).Orientation;
    Q = [cos(alpha), -sin(alpha); sin(alpha), cos(alpha)];
    x0 = stats(1).Centroid.';
    a = stats(1).MajorAxisLength;
    b = stats(1).MinorAxisLength;
    S = diag([1, a/b]);
    C = Q*S*Q';
    d = (eye(2) - C)*x0;
    tform = maketform('affine', [C d; 0 0 1]');
    Im2 = imtransform(redChannel, tform);
    subplot(2, 3, 5); 
    imshow(Im2);
于 2012-04-11T17:55:04.043 回答