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

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列

你可能感兴趣的:(Python&机器学习)