python中用于绘制各种图形的区域称作_python-在图形中概述区域

如果我正确理解的话,这是一个有趣的问题.为了确保您的意思,您想在像素值为3的所有连续区域周围绘制一条带有某种颜色的线.

我认为没有为此提供现成的功能,但让我们不要阻止它.我们将需要创建自己的功能.

我们可以从创建需要概述的区域的布尔图开始:

import numpy as np

import matplotlib.pyplot as plt

# our image with the numbers 1-3 is in array maskimg

# create a boolean image map which has trues only where maskimg[x,y] == 3

mapimg = (maskimg == 3)

# a vertical line segment is needed, when the pixels next to each other horizontally

# belong to diffferent groups (one is part of the mask, the other isn't)

# after this ver_seg has two arrays, one for row coordinates, the other for column coordinates

ver_seg = np.where(mapimg[:,1:] != mapimg[:,:-1])

# the same is repeated for horizontal segments

hor_seg = np.where(mapimg[1:,:] != mapimg[:-1,:])

# if we have a horizontal segment at 7,2, it means that it must be drawn between pixels

# (2,7) and (2,8), i.e. from (2,8)..(3,8)

# in order to draw a discountinuous line, we add Nones in between segments

l = []

for p in zip(*hor_seg):

l.append((p[1], p[0]+1))

l.append((p[1]+1, p[0]+1))

l.append((np.nan,np.nan))

# and the same for vertical segments

for p in zip(*ver_seg):

l.append((p[1]+1, p[0]))

l.append((p[1]+1, p[0]+1))

l.append((np.nan, np.nan))

# now we transform the list into a numpy array of Nx2 shape

segments = np.array(l)

# now we need to know something about the image which is shown

# at this point let's assume it has extents (x0, y0)..(x1,y1) on the axis

# drawn with origin='lower'

# with this information we can rescale our points

segments[:,0] = x0 + (x1-x0) * segments[:,0] / mapimg.shape[1]

segments[:,1] = y0 + (y1-y0) * segments[:,1] / mapimg.shape[0]

# and now there isn't anything else to do than plot it

plt.plot(segments[:,0], segments[:,1], color=(1,0,0,.5), linewidth=3)

让我们通过生成一些数据并显示它来进行测试:

image = np.cumsum(np.random.random((20,20))-.5, axis=1)

maskimg = np.zeros(image.shape, dtype='int')

maskimg[image > 0] = 3

x0 = -1.5

x1 = 1.5

y0 = 2.3

y1 = 3.8

plt.figure()

plt.imshow(maskimg, origin='lower', extent=[x0,x1,y0,y1], cmap=plt.cm.gray, interpolation='nearest')

plt.axis('tight')

之后,我们在顶部运行该过程,并获得:

如果需要,可以使代码更密集,但是现在注释占用了很多空间.对于大图像,通过查找连续路径来优化图像片段创建可能是明智的.这样可以将要绘制的点数减少多达三倍.但是,这样做需要一些不同的代码,这不像此代码那么清楚. (如果会出现要求提供评论和适当数量的支持的评论,我将其添加:)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值