我使用的是以下图片:
我需要平滑图像被分割的线条,使其看起来像这样:
我已经读过,最好的方法是使用直线方程:
y=mx+c
并沿分割区域找到四个点。但是我不确定如何找到四点。
有人可以指导我吗?
由于
我有代码,我用它来决定图像的哪一侧需要分段:
s= regionprops(BW2, 'BoundingBox');
BW3 = imcrop(BW2,s.BoundingBox);%crop the image
total1=sum(BW3(:,[1:5]));%get the total of the first 5 columns in the image
totalFirst=sum(total1);
total2=sum(BW3(:,[end-4:end])); %get the total of the last 5 columns in the image
totalLast=sum(total2);
%breast profile classified such that if the sum of the first 5 rows is
%greater than the last 5 rows then the breast is right orientated else it
%is left orientated.
if totalFirst>totalLast
O=1; % o for right
else
O=0; % 1 for left
end
答案 0 :(得分:1)
假设图像面向右侧,如上例所示 - 左侧图像可以使用fliplr
翻转。假设值0
的像素为黑色,值为1
的像素为白色。我能想象的最简单的算法如下:
1。从左上角开始,找到第一行中像素的列索引,即白色。我们用j0
来表示它。
j0 = 1;
while BW3(1, j0) ~= 1
j0 = j0 + 1;
end
2。从左上角重新开始,找到第一列中像素的行索引,即白色。用i0
表示。
i0 = 1;
while BW3(i0, 1) ~= 1
i0 = i0 + 1;
end
3. 这两个白色像素的坐标分别为(1, j0)
和(i0, 1)
。连接这两点的线左上角的点(等式:j = a * i + b
)必须用黑色标记:
a = (1 - j0) / (i0 - 1);
b = j0 - a;
for i = 1:i0
for j = 1:round(a * i + b)
BW3(i, j) = 0;
end
end
4. 此行右下角的某些像素仍为黑色。我们必须为这些白色着色。最简单的方法是将线条右下角的条带的颜色设置为白色。我们用w
来表示这个条带的宽度。
w = 20; % This depends on the resolution and the noise level of the image
for i = 1:round(i0 - w / a)
for j = max(1, round(a * i + b + 1)):round(a * i + b + w)
BW3(i, j) = 1;
end
end
备注强>
在步骤 1。中,不是检查第一行上单个像素的值,而是将其邻域(大小为n
)的平均值与a进行比较阈值(t
):
n = 10; t = 0.9; % These depend on the resolution and the noise level of the image
c = 0:(n - 1);
j0 = 1;
while mean(mean(BW3(1 + c, j0 + c))) < t
j0 = j0 + 1;
end
同样,在步骤 2。:
i0 = 1;
while mean(mean(BW3(i0 + c, 1 + c))) < t
i0 = i0 + 1;
end
<强>结果强>
我上传了代码here。