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