绘制线并切断 Circuler 区域
Draw line and Cut off Circuler area
我在运行下面的代码之后得到了下面的图像。
file='grayscale.png';
I=imread(file);
bw = im2bw(I);
bw = bwareaopen(bw,870);
imwrite(bw,'noiseReduced.png')
subplot(2,3,1),imshow(bw);
[~, threshold] = edge(bw, 'sobel');
fudgeFactor = .5;
im = edge(bw,'sobel', threshold * fudgeFactor);
subplot(2,3,2), imshow(im), title('binary gradient mask');
se = strel('disk',5);
closedim = imclose(im,se);
subplot(2,3,3), imshow(closedim), title('Connected Cirlces');
cc = bwconncomp(closedim);
S = regionprops(cc,'Centroid'); //returns the centers S(2) for innercircle
numPixels = cellfun(@numel,cc.PixelIdxList);
[biggest,idx] = min(numPixels);
im(cc.PixelIdxList{idx}) = 0;
subplot(2,3,4), imshow(im), title('Inner Cirlces Only');
c = S(2);
我现在的目标是在圆形对象周围画一个红色圆圈(见图)并从原始图像中裁剪圆形区域(区域)'I'并将裁剪区域保存为图像或执行其他任务.我该怎么做?
白色像素的凸包将为您提供相当不错的圆近似值。您可以找到中心作为船体区域的质心,半径作为从中心到船体顶点的平均距离。
或者,您可以 optimize/fit 最少 r
且包含所有点的圆:
bw = imread('http://i.stack.imgur.com/il0Va.png');
[yy xx]=find(bw);
现在,让 p
成为参数化圆的三向量:p(1), p(2)
是圆心的 x-y 坐标,p(3)
是它的半径。然后我们要最小化 r
(即 p(3)
):
obj = @(p) p(3);
以圆内所有点为准
con = @(p) deal((xx-p(1)).^2+(yy-p(2)).^2-p(3).^2, []);
优化 fmincon
:
[p, fval] = fmincon(obj, [mean(xx), mean(yy), size(bw,1)/4], [],[],[],[],[],[],con);
产量
p =
471.6397 484.4164 373.2125
绘制结果
imshow(bw,'border','tight');
colormap gray;hold on;
t=linspace(-pi,pi,1000);
plot(p(3)*cos(t)+p(1),p(3)*sin(t)+p(2),'r', 'LineWidth',1);
您可以生成与 bw
大小相同的二进制掩码,其中 true
位于圆圈内,false
位于圆圈外
msk = bsxfun(@plus, ((1:size(bw,2))-p(1)).^2, ((1:size(bw,1)).'-p(2)).^2 ) <= p(3).^2;
面具看起来像:
我在运行下面的代码之后得到了下面的图像。
file='grayscale.png';
I=imread(file);
bw = im2bw(I);
bw = bwareaopen(bw,870);
imwrite(bw,'noiseReduced.png')
subplot(2,3,1),imshow(bw);
[~, threshold] = edge(bw, 'sobel');
fudgeFactor = .5;
im = edge(bw,'sobel', threshold * fudgeFactor);
subplot(2,3,2), imshow(im), title('binary gradient mask');
se = strel('disk',5);
closedim = imclose(im,se);
subplot(2,3,3), imshow(closedim), title('Connected Cirlces');
cc = bwconncomp(closedim);
S = regionprops(cc,'Centroid'); //returns the centers S(2) for innercircle
numPixels = cellfun(@numel,cc.PixelIdxList);
[biggest,idx] = min(numPixels);
im(cc.PixelIdxList{idx}) = 0;
subplot(2,3,4), imshow(im), title('Inner Cirlces Only');
c = S(2);
我现在的目标是在圆形对象周围画一个红色圆圈(见图)并从原始图像中裁剪圆形区域(区域)'I'并将裁剪区域保存为图像或执行其他任务.我该怎么做?
白色像素的凸包将为您提供相当不错的圆近似值。您可以找到中心作为船体区域的质心,半径作为从中心到船体顶点的平均距离。
或者,您可以 optimize/fit 最少 r
且包含所有点的圆:
bw = imread('http://i.stack.imgur.com/il0Va.png');
[yy xx]=find(bw);
现在,让 p
成为参数化圆的三向量:p(1), p(2)
是圆心的 x-y 坐标,p(3)
是它的半径。然后我们要最小化 r
(即 p(3)
):
obj = @(p) p(3);
以圆内所有点为准
con = @(p) deal((xx-p(1)).^2+(yy-p(2)).^2-p(3).^2, []);
优化 fmincon
:
[p, fval] = fmincon(obj, [mean(xx), mean(yy), size(bw,1)/4], [],[],[],[],[],[],con);
产量
p =
471.6397 484.4164 373.2125
绘制结果
imshow(bw,'border','tight');
colormap gray;hold on;
t=linspace(-pi,pi,1000);
plot(p(3)*cos(t)+p(1),p(3)*sin(t)+p(2),'r', 'LineWidth',1);
您可以生成与 bw
大小相同的二进制掩码,其中 true
位于圆圈内,false
位于圆圈外
msk = bsxfun(@plus, ((1:size(bw,2))-p(1)).^2, ((1:size(bw,1)).'-p(2)).^2 ) <= p(3).^2;
面具看起来像: