拉伸图像中的椭圆以形成圆形

时间:2012-04-05 18:39:27

标签: matlab image-processing

我想拉伸图像中的椭圆形物体,直到它形成一个圆圈。我的程序当前输入一个带有椭圆形物体的图像(例如一个角度的硬币),阈值并将其二值化,使用edge-detect / 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')

2 个答案:

答案 0 :(得分:1)

你知道圆的直径,你知道中心是长轴和短轴相交的位置。因此,只需从直径计算半径r,对于图像中的每个像素,检查该像素距离cirlce中心的欧几里德距离是否小于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函数与逻辑索引结合来避免循环来优化。

答案 1 :(得分: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);