传统for循环对于大量图片访问较慢。如何使用np.where()来访问像素 并操作呢?
实例:读一个灰度图,得到所有满足条件(灰度=10)像素点坐标,并存放到列表
img=cv2.imread("./db/image_cut/image_cut2.bmp",0)#第二个参数为0代表以灰度图的方式读入
height = len(img)
width = len(img[0])
listx=[]
listy=[]
n=10
begin3=time.time()
for k in range(0,height):
for j in range(0,width):
if img[k,j]==n:
listx.append(k)
listy.append(j)
end3=time.time()
print("时间:",(end3-begin3)*1000)
看图大小,做实验的图是320*640,特征点是5个10*10
左右的像素,用时450ms左右
img=cv2.imread("./db/image_cut/image_cut2.bmp",0)#第二个参数为0代表以灰度图的方式读入
listx=[]
listy=[]
begin3=time.time()
xy=np.where(img==n)
listx=list(xy)[0]
listy=list(xy)[1]
end3=time.time()
print("时间:",(end3-begin3)*1000)
图和上面的实验是一张图,耗时22ms。众所周知
python的for循环效率很很低,所以能用np.where就用这个了
表达式
numpy.where(condition, x, y)
Return elements chosen from x or y depending on condition.
只需要把条件传递给它,它就会返回一个使得条件为真的元素的元组。
注:当只个一个参数时,np.where(condition)
是np.asarray(condition).nonzero()
的简写
a = np.arange(10)
b=np.where(a < 5, a, 10*a)
#b的值 array([ 0, 1, 2, 3, 4, 50, 60, 70, 80, 90])
解释:条件是a<5
,当满足的时候执行x
,不满足执行y
a=np.arange(0,100)
b= a.reshape(4,25)
c=np.where(b%25==0)
print(c)
d=list(c)[0]
print(d)
输出
(array([0, 1, 2, 3], dtype=int64), array([0, 0, 0, 0], dtype=int64))
[0 1 2 3]
解释:输出的这个元组c
是什么意思呢,元组第一个元素是0,1,2,3,也就是行,第二组元素是0,0,0,0是列,比如上面的np.where(b%25==0)
就是要得到可以整除25的值,返回坐标,数组b里面满足条件的刚好是每行的第0列