python

您所在的位置:网站首页 像素如何画圆形 python

python

2024-06-16 07:44| 来源: 网络整理| 查看: 265

我正在尝试在Python中圆形 mask 图像。我在网上找到了一些示例代码,但是我不确定如何更改数学以正确地定位我的圈子。

我有一个类型为image_data的numpy.ndarray类型的图像(3725, 4797, 3):

total_rows, total_cols, total_layers = image_data.shape X, Y = np.ogrid[:total_rows, :total_cols] center_row, center_col = total_rows/2, total_cols/2 dist_from_center = (X - total_rows)**2 + (Y - total_cols)**2 radius = (total_rows/2)**2 circular_mask = (dist_from_center > radius) 我看到此代码将欧几里德距离应用于dist_from_center的计算,但是我不理解X - total_rows和Y - total_cols部分。这将产生一个四分之一圆的蒙版(以图像的左上角为中心)。

圈子中的X和Y扮演什么角色?以及如何修改此代码以产生一个在图像中其他位置居中的蒙版?

最佳答案

您上网的算法部分错误,至少出于您的目的。如果我们有以下图像,我们希望将其屏蔽为:

Image to mask Masked image

创建这样的掩码的最简单方法是算法的运行方式,但是它并未以您想要的方式呈现,也没有使您能够以简单的方式对其进行修改。我们需要做的是查看图像中每个像素的坐标,并获取该像素是否在半径之内的真/假值。例如,这是一张放大的图片,显示了圆半径和严格位于该半径内的像素:

Pixels inside the radius

现在,要弄清楚哪些像素位于圆内,我们需要图像中每个像素的索引。函数 np.ogrid() 提供两个 vector ,每个 vector 包含像素位置(或索引):有一个列 vector 用于列索引,行 vector 用于行索引:

>>> np.ogrid[:4,:5] [array([[0], [1], [2], [3]]), array([[0, 1, 2, 3, 4]])] 这种格式对broadcasting很有用,因此,如果我们在某些函数中使用它们,它将实际上创建一个包含所有索引的网格,而不仅仅是两个 vector 。因此,我们可以使用np.ogrid()创建图像的索引(或像素坐标),然后检查每个像素坐标以查看其在圆内还是圆外。为了判断它是否在中心内,我们可以简单地找到从中心到每个像素位置的欧几里得距离,然后,如果该距离小于圆半径,我们将其标记为蒙版中的大于此值,我们将其从 mask 中排除。

现在,我们已经具备了创建此蒙版的函数所需的一切。此外,我们将为其添加一些不错的功能;我们可以输入中心和半径,或者让它自动计算它们。

def create_circular_mask(h, w, center=None, radius=None): if center is None: # use the middle of the image center = (int(w/2), int(h/2)) if radius is None: # use the smallest distance between the center and image walls radius = min(center[0], center[1], w-center[0], h-center[1]) Y, X = np.ogrid[:h, :w] dist_from_center = np.sqrt((X - center[0])**2 + (Y-center[1])**2) mask = dist_from_center


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3