如何在 MATLAB 中在图像上画圆?
我在 MATLAB 中有一个图像:
im = rgb2gray(imread('some_image.jpg');
% normalize the image to be between 0 and 1
im = im/max(max(im));
我已经进行了一些处理,得到了一些我想要突出显示的点:
points = some_processing(im);
其中 points
是一个与 im 大小相同的矩阵> 有趣的地方。
现在我想在图像上所有points
为1的地方画一个圆。MATLAB
中有没有函数可以做到这一点?我能想到的最好的办法是:
[x_p, y_p] = find (points);
[x, y] = meshgrid(1:size(im,1), 1:size(im,2))
r = 5;
circles = zeros(size(im));
for k = 1:length(x_p)
circles = circles + (floor((x - x_p(k)).^2 + (y - y_p(k)).^2) == r);
end
% normalize circles
circles = circles/max(max(circles));
output = im + circles;
imshow(output)
这看起来有点不优雅。有没有类似line
功能画圆的方法?
I have an image in MATLAB:
im = rgb2gray(imread('some_image.jpg');
% normalize the image to be between 0 and 1
im = im/max(max(im));
And I've done some processing that resulted in a number of points that I want to highlight:
points = some_processing(im);
Where points
is a matrix the same size as im
with ones in the interesting points.
Now I want to draw a circle on the image in all the places where points
is 1.
Is there any function in MATLAB that does this? The best I can come up with is:
[x_p, y_p] = find (points);
[x, y] = meshgrid(1:size(im,1), 1:size(im,2))
r = 5;
circles = zeros(size(im));
for k = 1:length(x_p)
circles = circles + (floor((x - x_p(k)).^2 + (y - y_p(k)).^2) == r);
end
% normalize circles
circles = circles/max(max(circles));
output = im + circles;
imshow(output)
This seems more than somewhat inelegant. Is there a way to draw circles similar to the line
function?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
您可以使用普通的 PLOT 命令和 < a href="http://www.mathworks.com/access/helpdesk/help/techdoc/ref/lineseriesproperties.html#Marker" rel="nofollow noreferrer">圆形标记点:
您还可以调整这些绘图标记的其他属性:
MarkerEdgeColor< /code>
,
MarkerFaceColor
,标记大小
。如果您想保存带有标记的新图像,您可以查看 我给出的这个答案是关于在保存图形图像时维护图像尺寸的问题。
注意:使用 绘制图像数据时IMSHOW (或 IMAGE 等.),行和列的正常解释本质上被翻转了。通常,数据的第一个维度(即行)被认为是位于 x 轴上的数据,这可能就是您使用
x_p
作为 FIND 函数。但是,IMSHOW 沿 y 轴 显示图像数据的第一个维度,因此在这种情况下,FIND 返回的第一个值最终是 y 坐标值。You could use the normal PLOT command with a circular marker point:
You can also adjust these other properties of the plot marker:
MarkerEdgeColor
,MarkerFaceColor
,MarkerSize
.If you then want to save the new image with the markers plotted on it, you can look at this answer I gave to a question about maintaining image dimensions when saving images from figures.
NOTE: When plotting image data with IMSHOW (or IMAGE, etc.), the normal interpretation of rows and columns essentially becomes flipped. Normally the first dimension of data (i.e. rows) is thought of as the data that would lie on the x-axis, and is probably why you use
x_p
as the first set of values returned by the FIND function. However, IMSHOW displays the first dimension of the image data along the y-axis, so the first value returned by FIND ends up being the y-coordinate value in this case.此文件,作者:Zhenhai Wang,来自 Matlab Central 的文件交换中心就可以了。
This file by Zhenhai Wang from Matlab Central's File Exchange does the trick.
有趣的!这里有 6 个答案,但没有一个给出明显的解决方案:矩形函数。
来自文档:
因此,在您的情况下:
与接受的答案相反,这些圆圈将随图像缩放,您可以放大,它们将始终标记整个像素。
Funny! There are 6 answers here, none give the obvious solution: the
rectangle
function.From the documentation:
So in your case:
As opposed to the accepted answer, these circles will scale with the image, you can zoom in an they will always mark the whole pixel.
嗯,我必须在这次调用中重新切换它们:
回复评论:
x 和 y 是使用以下代码创建的:
ConvexHull 可能是相反的,因此绘图是不同的。或者我犯了一个错误,应该是
但是文档不清楚哪一列= x OR y:
引用:“矩阵的每一行都包含多边形一个顶点的 x 和 y 坐标。”
我将其读为 x 是第一列,y 是第二列。
Hmm I had to re-switch them in this call:
In reply to the comments:
x and y are created using the following code:
it might be that the ConvexHull is the other way around and therefore the plot is different. Or that I made a mistake and it should be
However the documentation is not clear about which colum = x OR y:
Quote: "Each row of the matrix contains the x- and y-coordinates of one vertex of the polygon. "
I read this as x is the first column and y is the second colum.
在较新版本的 MATLAB(我有 2013b)中,计算机视觉系统工具箱包含
vision.ShapeInserter
系统对象,可用于在图像上绘制形状。以下是文档中绘制黄色圆圈的示例:In newer versions of MATLAB (I have 2013b) the Computer Vision System Toolbox contains the
vision.ShapeInserter
System object which can be used to draw shapes on images. Here is an example of drawing yellow circles from the documentation:通过 MATLAB and Image Processing Toolbox R2012a 或更高版本,您可以使用
viscircles< /code>
函数可以轻松地将圆圈覆盖在图像上。这是一个示例:
另外,请查看
imfindcircles
< /a> 实现霍夫循环变换的函数。这两个函数的在线文档(上面的链接)提供了示例,展示了如何在图像中查找圆圈以及如何在图像上显示检测到的圆圈。例如:
With MATLAB and Image Processing Toolbox R2012a or newer, you can use the
viscircles
function to easily overlay circles over an image. Here is an example:Also, check out the
imfindcircles
function which implements the Hough circular transform. The online documentation for both functions (links above) have examples that show how to find circles in an image and how to display the detected circles over the image.For example:
这是我认为你需要的方法:
Here's the method I think you need: