python+OpenCV图像处理(二)图像像素的访问、通道的合并与分离
圖像像素的訪問、通道的合并與分離
(一)像素訪問
在第一篇博客中,向大家介紹了,所謂的圖像在計算機看來就是一個矩陣,對于RGB圖像矩陣一共有三層,分別代表著RGB通道,矩陣中每一個數的大小代表著不同通道的亮度,范圍在0~255之間。
訪問圖像的像素,就如同對矩陣元素的訪問,很好理解。
print(img[0][0][0])輸出為:
34也可以對所讀取的圖像矩陣的像素進行賦值
for i in range(400):for j in range(400):for k in range(3):img[i][j][k] = 255顯示圖像為:
可以看到上圖左上角形成了400x400像素的白色區域。
利用這個圖像矩陣的特點,我們還可以做一些有趣的事情。比如說,椒鹽現象。
我們需要先寫一個椒鹽函數,將我們想要的像素隨機的分布在圖像上。
def salt(img, numbers):for x in range(numbers):i = np.random.randint(img.shape[0])j = np.random.randint(img.shape[1])for k in range(3):img[i][j][k] = 255return img嘿嘿,先來上1000個點!
img = salt(img, 1000)圖像顯示為:
(二)通道分離
對于RGB圖像,擁有RGB三原色通道,從矩陣的角度來講,可以理解為三層矩陣,也就是三維的矩陣,每一層代表著一個通道。將圖片進行通道分離可以使用OpenCV里的split函數,也可以通過numpy庫對圖像矩陣進行直接操作。圖像展示的是不同通道的256級灰度圖。
b, g, r = cv2.split(img)cv2.namedWindow('Blue') cv2.imshow('Blue', b) cv2.waitKey(0)cv2.namedWindow('Green') cv2.imshow('Green', g) cv2.waitKey(0)cv2.namedWindow('Red') cv2.imshow('Red', r) cv2.waitKey(0)如果單獨保留一個通道,并且令其它通道的圖像矩陣的值全為零,將會變得更加好看,特意找了一個小的圖片,避免篇幅過長。
img = cv2.imread('tongren.jpg') b, g, r = cv2.split(img)pic = np.zeros(np.shape(img), np.uint8) pic[:, :, 0] = b cv2.namedWindow('Blue') cv2.imshow('Blue', pic) cv2.waitKey(0)pic = np.zeros(np.shape(img), np.uint8) pic[:, :, 1] = g cv2.namedWindow('Green') cv2.imshow('Green', pic) cv2.waitKey(0)pic = np.zeros(np.shape(img), np.uint8) pic[:, :, 2] = r cv2.namedWindow('Red') cv2.imshow('Red', pic) cv2.waitKey(0)cv2.destroyAllWindows()也可以任選兩個通道進行拼接。
pic = np.zeros(np.shape(img), np.uint8) pic[:, :, 0] = b pic[:, :, 1] = g cv2.namedWindow('Blue-Green') cv2.imshow('Blue-Green', pic) cv2.waitKey(0)pic = np.zeros(np.shape(img), np.uint8) pic[:, :, 0] = b pic[:, :, 2] = r cv2.namedWindow('Blue-Red') cv2.imshow('Blue-Red', pic) cv2.waitKey(0)pic = np.zeros(np.shape(img), np.uint8) pic[:, :, 1] = g pic[:, :, 2] = r cv2.namedWindow('Green-Red') cv2.imshow('Green-Red', pic) cv2.waitKey(0)cv2.destroyAllWindows()(三)通道合并
通道合并經常用的有兩種方法
第一個是:OpenCV中自帶的函數megre
megre = cv2.merge([b, g, r])第二個是:numpy模塊中的dstack,深度拼接函數
dstack = np.dstack([b, g, r])但這兩種拼接方式是不一樣的,這一點一定要注意。pandas中也有對矩陣的拼接操作也可實現np.dstack()相同的效果,這里就不介紹了。
總結
以上是生活随笔為你收集整理的python+OpenCV图像处理(二)图像像素的访问、通道的合并与分离的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: OpenCV可移植图形工具HighGUI
- 下一篇: BAT文件命名中含有英文括号运行出错