Matlab,使用直线方程去除粗糙边缘

时间:2014-03-28 16:17:57

标签: matlab image-processing

我使用的是以下图片:

Before

我需要平滑图像被分割的线条,使其看起来像这样:

After

我已经读过,最好的方法是使用直线方程:

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 

1 个答案:

答案 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 

<强>结果

enter image description here

我上传了代码here