【问题标题】:How to draw a line between two coordinates of an image permanently in Matlab? [duplicate]如何在Matlab中永久地在图像的两个坐标之间画一条线? [复制]
【发布时间】:2018-05-16 08:09:07
【问题描述】:

我有一组要按顺序连接的点。假设点是 (A1,A2,A3,...A9);我想将A1连接到A2,A2连接到A3等等,最后将A9连接到A1。

我只需要知道一个可以帮助我将 A1 连接到 A2 的函数,其余的可以使用 for 循环来完成。

我知道连接两点之前已经在这里问过好几次了,但我找不到我需要的答案。一些解决方案建议使用“绘图”和“线条”,但这些函数会将结果叠加在图像上,实际上不会对原始图像进行任何更改。

我确实尝试过,并设法使用“saveas”和“print”函数保存了结果图,但是图像没有以正确的格式保存,并且使用这些函数的参数存在很多问题.此外,我真的不想保存图像,如果我能用线条获得所需的图像,这只是我愿意添加的不必要的开销。 我也尝试过“imline”来画线,但它似乎是交互式的。

This 特定问题完美地反映了我的问题,但是当我运行作为解决方案给出的代码 sn-ps 时,它们都在结果图像中给出了一组点。

我在this 找到here 的图片链接中尝试了上述代码。

虚线是上面链接中所有三个代码 sn-ps 的输出。 例如,我运行第一个代码是这样的:

I = imread('berries_copy.png'); 
grayImage=rgb2gray(I); 
img =false(size(grayImage,1), size(grayImage,2)); 

我写上面这段代码只是为了得到一个黑色的图像用于以下操作:

x = [500 470];        % x coordinates 
y = [300 310];        % y coordinates
nPoints = max(abs(diff(x)), abs(diff(y)))+1;    % Number of points in line
rIndex = round(linspace(y(1), y(2), nPoints));  % Row indices
cIndex = round(linspace(x(1), x(2), nPoints));  % Column indices
index = sub2ind(size(img), rIndex, cIndex);     % Linear indices
img(index) = 255;  % Set the line points to white
imshow(img);       % Display the image

This 是上述代码以及其他两个代码的结果图像,如您所见,它只是黑色背景上的几个点,这不是所需的输出。

我更改了代码并使用“绘图”函数来获得this 输出,这正是我想要的。无论如何我可以将虚线输出更改为实线吗?

或者,如果有人能提出一个简单的函数或方法来从 A1 到 A2 画一条线,并且实际上会改变输入图像,我将不胜感激。 (我真的希望这只是我是一个新手,而不是 Matlab 没有一个简单的功能来在图像中画一条线。)

附:我没有计算机视觉工具箱,如果可能的话,我想找到一个不涉及它的解决方案。

【问题讨论】:

  • " 当我运行作为解决方案给出的代码 sn-ps 时,它们都在生成的图像中给出了一些随机点"我猜你跑错了。
  • @Ander Biguri 不。我只为他们创建了新程序,除了更改坐标(这是有效的)之外,我没有做任何其他事情。代码 sn-ps 下的 cmets 似乎表明了某些问题。此外,插值函数似乎给出了我认为是随机点的虚线,知道如何使它成为实线吗?
  • 链接答案中的代码有效。你说它不适合你。除非您显示minimal reproducible example,否则除了“您做错了”之外没有其他结论,我们无能为力。
  • @ander Biguri 我将编辑我的代码,谢谢。但是画线真的没有内置函数吗?
  • 是的,在计算机视觉工具箱中。你也不想画线吧?您想修改图像,使其包含一条线。这是不同的。否则只需使用plot

标签: matlab image-processing


【解决方案1】:

您的第一个问题是您正在创建一个 blank 图像,其大小与您使用此行加载的图像大小相同:

img =false(size(grayImage,1), size(grayImage,2));

当您向其中添加线条时,您会得到一个带有白色线条的黑色图像,正如预期的那样。

您的第二个问题是您尝试将grayscale intensity images 的解决方案应用于RGB (Truecolor) image,这需要您使用modify the data at the given indices for all three color planes(红色、绿色和蓝色)。以下是如何从my other answer修改灰度解决方案:

img = imread('berries_copy.png');  % Load image
[R, C, D] = size(img);             % Get dimension sizes, D should be 3
x = [500 470];                     % x coordinates
y = [300 310];                     % y coordinates
nPoints = max(abs(diff(x)), abs(diff(y)))+1;    % Number of points in line
rIndex = round(linspace(y(1), y(2), nPoints));  % Row indices
cIndex = round(linspace(x(1), x(2), nPoints));  % Column indices
index = sub2ind([R C], rIndex, cIndex);         % Linear indices
img(index) = 255;                  % Modify red plane
img(index+R*C) = 255;              % Modify green plane
img(index+2*R*C) = 255;            % Modify blue plane
imshow(img);                       % Display image
imwrite(img, 'berries_line.png');  % Save image, if desired

以及生成的图像(注意右下角浆果上方的白线):

【讨论】:

  • 谢谢。在“img =false(size(grayImage,1), size(grayImage,2));”上运行代码虽然没有给出一条实线。它提供this 输出。
  • 对不起,我想你把我的问题弄糊涂了。我不希望线条出现在彩色图像上。那只是我拍摄的示例图像。我希望这条线出现在二进制图像上,但是当我运行代码时,出现的只是一条虚线,而我想要一条实线。
  • @Matte:那么就不需要彩色图像了。这只是令人困惑。您可以创建像img = zeros(424, 640, 'uint8'); 这样的空白图像。此外,问题不在于算法,而在于显示。正如您所提到的,缩放显示图像数据正在被正确修改。您似乎试图以低得多的分辨率显示它,从而导致出现虚线外观。图片在屏幕上占据的大小(以像素为单位)是多少?
  • 对不起,您是对的,图像以较低的分辨率显示。
  • 我之所以选择 Zep's 作为答案,是因为我首先使用它,但您的 answer 已经为我工作,所以我对此表示赞同并在此处选择 Zep 的答案。感谢您的帮助。
【解决方案2】:

您可以使用 Bresenham 算法。当然它已经实现了,你可以在这里找到它:Bresenham optimized for Matlab。该算法选择近似于一条线的像素。

一个简单的例子,使用你的变量名可以是:

I = rgb2gray(imread('peppers.png'));
A1 = [1 1];
A2 = [40 40];
[x y] = bresenham(A1(1),A1(2),A2(1),A2(2));
ind = sub2ind(size(I),x,y);
I(ind) = 255;
imshow(I) 

【讨论】:

  • 谢谢,我运行了它,但它只给出了使用“绘图”功能绘制在图像上的 x 和 y 坐标。
  • 不,你可以看到我不使用绘图功能。我修改图像中的像素。 Bresenham 算法告诉您要修改哪些像素!
【解决方案3】:

您可以使用 imshow 显示图像,然后使用 plot 绘制线条并保存图形。检查以下代码:

I = imread('peppers.png') ;
imshow(I)
hold on
[m,n,p] = size(I) ;
%% Get random points A1, A2,..A10
N = 9 ;
x = (n-1)*rand(1,N)+1 ;
y = (m-1)*rand(1,N)+1 ;
P = [x; y]; % coordinates / points 
c = mean(P,2); % mean/ central point 
d = P-c ; % vectors connecting the central point and the given points 
th = atan2(d(2,:),d(1,:)); % angle above x axis
[th, idx] = sort(th);   % sorting the angles 
P = P(:,idx); % sorting the given points
P = [P P(:,1)]; % add the first at the end to close the polygon 
plot( P(1,:), P(2,:), 'k');
saveas(gcf,'image.png')

【讨论】:

  • 谢谢。这是我最初的解决方案,它作为一个独立的程序工作,但是当我将它集成到一个更大的程序中时,我有很多图像要显示,保存的图像不是我想要的。我不知道gcf句柄是否需要修改以反映当前图形,我查看了一下并画了一个空白。
  • 在将其保存到图像之前......你能在图像上看到你想要的线条吗?
  • 是的,我使用“绘图”功能时可以看到图像的变化,但保存后结果消失了。
  • 你是怎么保存的?在此处将您的图像附加为 .fig 图像....
  • 我保存为.png文件如下:saveas(gcf,'file','png');
猜你喜欢
  • 2019-03-15
  • 1970-01-01
  • 2021-04-04
  • 2012-06-10
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多