python用np.where遍历图像像素(更快的遍历)

tech2022-07-07  312

python np.where遍历图像像素

传统for循环对于大量图片访问较慢。如何使用np.where()来访问像素 并操作呢?

实例:读一个灰度图,得到所有满足条件(灰度=10)像素点坐标,并存放到列表

使用for循环嵌套遍历

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左右

使用np.where()遍历

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就用这个了

关键点

np.where返回的是元组n维数组返回的是n维元组np.where的用法

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列

最新回复(0)