访问图像像素
#!/usr/bin/env python
# encoding: utf-8
import numpy as np
import cv2
#像素的访问和访问numpy中ndarray的方法完全一样
img[j,i] = 255 # 灰度图访问;j,i 分别表示图像的行和列
#BGR 图像访问
img[j,i,0] = 255 # 0 -- 为通道,指B通道
img[j,i,1] = 255 # 1 -- 为通道,指G通道
img[j,i,2] = 255 # 2 -- 为通道,指R通道
完整示例(给图像加上白色点点):
#!/usr/bin/env python
# encoding: utf-8
import cv2
import numpy as np
def salt(img, n):
for k in range(n):
#img.shape[0] -- 取得img 的列(图片的高)
#img.shape[1] -- 取得img 的行(图片的宽)
i = int(np.random.random() * img.shape[1]);
j = int(np.random.random() * img.shape[0]);
#判断是否为2维数组(即为灰度图像)
if img.ndim == 2:
img[j,i] = 255 #设置值为白点
elif img.ndim == 3: #判断是否为3维数组(即为RGB图像)
img[j,i,0]= 255
img[j,i,1]= 255
img[j,i,2]= 255
return img
if __name__ == '__main__':
img = cv2.imread("mini.jpg")
saltImage = salt(img, 500)
cv2.imshow("Salt", saltImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
几点注意说明:
1. 与c++ 版的opencv 不同,在Python 中灰度图的 img.ndim = 2 ,而 c++ 中灰度图图像的通道数 img.channel() = 1
2. 关于使用np.random.random()
这里使用了 Numpy 的随机数,Python自带也有一个随机数。np.random模块中拥有更多的方法,而Python 自带的random只是一个轻量级的模块。
要注意的是np.random.seed() 不是线程安全的,而Python 自带的random.seed() 是线程安全的。如果使用随机数时需要用到多线程,建议使用Python
自带的random() 和 random.seed() ,或者构建一个本地的np.random.Random 类的实例
参考和转载地址:
http://blog.csdn.net/sunny2038/article/details/9080047