python可以调用opencv中提供的诸多方法来完成,对图像像素访问,RGB等通道的分离与合并
一. 像素访问
opencv中使用 imread读出来的图片直接可以通过 im[i,j,0] 访问i,j位置的R通道(默认是RGB)
代码示例:
#访问像素点,生成模拟带有小孔图片
import cv2
import numpy as np
def salt(img, n):
for k in range(n):
i = int(np.random.random() * img.shape[1])
j = int(np.random.random() * img.shape[0])
if img.ndim == 2:
img[j,i] = 255
elif img.ndim == 3:
img[j,i,0]= 0
img[j,i,1]= 0
img[j,i,2]= 0
return img
if __name__ == '__main__':
img = cv2.imread("test1.jpg")
saltImage = salt(img, 1000)
cv2.imshow("Salt", saltImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
为什么使用np.random.random()?
这里使用了numpy的随机数,Python自身也有一个随机数生成函数。这里只是一种习惯,
np.random模块中拥有更多的方法,而Python自带的random只是一个轻量级的模块。不
过需要注意的是np.random.seed()不是线程安全的,而Python自带的random.seed()是
线程安全的。如果使用随机数时需要用到多线程,建议使用Python自带的random()和
random.seed(),或者构建一个本地的np.random.Random类的实例。
出自:这里
二. 通道分离
三种方式:
1.使用OpenCV自带的split函数
b, g, r = cv2.split(img)
2.通过访问cv2.split(img)数组来分离
b = cv2.split(img)[0]
g = cv2.split(img)[1]
r = cv2.split(img)[2]
3.直接操作NumPy数组来完成分离
注意:需要先要开辟一个相同大小的图片出来。这是由于numpy中数组的复制有些需要注意的地方
b = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
g = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
r = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
b[:,:] = img[:,:,0]
g[:,:] = img[:,:,1]
r[:,:] = img[:,:,2]
三. 通道合并
使用opencv 提供的merge函数进行合并,
注意:顺序不是RGB而是 BGR,否则会不会是原图
#合并RGB(b,g,r 顺序没写对,不会合成原图)
merged = cv2.merge([b,g,r])
cv2.imshow("merged", merged)
测试完整代码:
#coding=utf-8
#
# 图像像素访问.通道分离与合并
#
'''
#访问像素点,模拟带有模拟椒盐现象的图片
import cv2
import numpy as np
def salt(img, n):
for k in range(n):
i = int(np.random.random() * img.shape[1])
j = int(np.random.random() * img.shape[0])
if img.ndim == 2:
img[j,i] = 255
elif img.ndim == 3:
img[j,i,0]= 255
img[j,i,1]= 255
img[j,i,2]= 255
return img
if __name__ == '__main__':
img = cv2.imread("test1.jpg")
saltImage = salt(img, 1000)
cv2.imshow("Salt", saltImage)
cv2.waitKey(0)
cv2.destroyAllWindows()
'''
import cv2
import numpy as np
img = cv2.imread("test1.jpg")
#分离方法1:使用OpenCV自带的split函数
b, g, r = cv2.split(img)
#分离方法2:通过访问cv2.split(img)数组来分离
#b = cv2.split(img)[0]
#g = cv2.split(img)[1]
#r = cv2.split(img)[2]
'''
分离方法3:直接操作NumPy数组来完成分离
注意:需要先要开辟一个相同大小的图片出来。这是由于numpy中数组的复制有些需要注意的地方
b = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
g = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
r = np.zeros((img.shape[0],img.shape[1]), dtype=img.dtype)
b[:,:] = img[:,:,0]
g[:,:] = img[:,:,1]
r[:,:] = img[:,:,2]
'''
cv2.imshow("Blue", r)
cv2.imshow("Red", g)
cv2.imshow("Green", b)
#合并RGB(b,g,r 顺序没写对,不会合成原图)
merged = cv2.merge([b,g,r])
cv2.imshow("merged", merged)
cv2.waitKey(0)
cv2.destroyAllWindows()
参考博客:
http://blog.csdn.net/sunny2038/article/details/9080047