OpenCV:圖片操作基本知識(二)
插播個廣告 公眾號:大鄧帶你玩python
1.1隨機生成像素
生成與test.jpg相同大小圖片,但是像素是隨機生成的。
import numpy as npimport cv2raw_image = cv2.imread(test圖片路徑)cv2.imshow(raw image,raw_image) #獲取圖片像素的行數和列數rows = raw_image.shape[0]cols = raw_image.shape[1] #生成像素空數組,整數型。待填充隨機色數值image = np.zeros(shape=(rows,cols,3), dtype=np.uint8) for r in range(rows): for c in range(cols): image[r, c, 0] = np.random.randint(0, 255) image[r, c, 1] = np.random.randint(0, 255) image[r, c, 2] = np.random.randint(0, 255)cv2.imshow(random pixel image, image)cv2.waitKey()cv2.destroyAllWindows()
1.2負片
負片(Negative Film)是經曝光和顯影加工後得到的影像,其明暗與被攝體相反,其色彩則為被攝體的補色。即
負片上的像素值 = 255-原值
代碼
import numpy as npimport cv2image = cv2.imread(test圖片路徑)cv2.imshow(raw image, image)rows = image.shape[0]cols = image.shape[1] for r in range(rows): for c in range(cols): image[r, c, 0] = 255-image[r, c, 0] image[r, c, 1] = 255-image[r, c, 1] image[r, c, 2] = 255-image[r, c, 2]cv2.imshow(negative image, image)cv2.waitKey()cv2.destroyAllWindows()
1.3圖像平鋪
生成2*3,兩行三列6個美女頭像的一張圖。
import numpy as npimport cv2image = cv2.imread(測試頭像圖片路徑) #原圖行數列數rows = image.shape[0]cols = image.shape[1] #新圖平鋪2行三列,即新圖行數變為2倍,列數變為3倍new_rows = rows * 2new_cols = cols * 3 #生成新圖的數組new_image = np.zeros(shape=(new_rows, new_cols, 3), dtype=np.uint8) #複製原圖的每一個像素row = 0col = 0 for now_row in range(new_rows): for now_col in range(new_cols): new_image[now_row, now_col, 0] = image[row, col, 0] new_image[now_row, now_col, 1] = image[row, col, 1] new_image[now_row, now_col, 2] = image[row, col, 2] col+=1 #超過原圖列數範圍,歸0,重新開始複製 if col>=cols: col=0 row+=1 #超過原圖行數範圍,歸0,重新開始複製 if row>=rows: row=0cv2.imshow(new image, new_image)cv2.waitKey()cv2.destroyAllWindows()
1.4轉置矩陣(90度旋轉圖片)
矩陣的知識,轉置
a b
c d
變為
a c
b d
import numpy as npimport cv2image = cv2.imread(test圖片路徑)cv2.imshow(raw image, image) #transpose()交換ndarray數組的0軸和1軸new_image = image.copy().transpose(1,0,2) cv2.imshow(transpose image, new_image)cv2.waitKey()cv2.destroyAllWindows()
如果不懂ndarray數組的transpose()方法,可以翻看下numpy基本知識。(真正感到大學的線代開始有用了。)
1.5圖像融合
圖像融合的原理是,讓新圖像的每個像素成為源圖像中相應位置像素值平均值之和。即 源圖片A、B,合成C圖。
第m行,n列的像素
C[b,g,r]=(A[b,g,r]+B[b,g,r])/2
代碼
import numpy as npimport cv2#A、B、C圖的尺寸相同A_img = cv2.imread(a圖片路徑)B_img = cv2.imread(b圖片路徑)cv2.imshow(A, A_img)cv2.imshow(B, B_img)rows = A_img.shape[0]cols = A_img.shape[1]C_img = np.zeros(shape=(rows, cols, 3), dtype=np.uint8) for r in range(rows): for c in range(cols): C_img[r, c, :] = (A_img[r, c, :]+B_img[r, c, :])/2cv2.imshow(C,C_img)cv2.waitKey()cv2.destroyAllWindows()
1.6 圖片鏡像
圖片鏡像是指圖片中沿著中間線左右或上下對稱。如下圖,是沿著中間,左右對稱。
假設圖片是對稱的,圖片寬度(圖片像素列數)為w,選取任意行(這裡選第r行)那麼圖中對稱的兩個點A1、A2,其中A1點坐標(r,w1),A2點必然要滿足
A1[r,w1,:]= A2[r,w-w1,:]
代碼
import numpy as npimport cv2image = cv2.imread(測試頭像路徑)rows = image.shape[0]cols = image.shape[1]mirror_col = int(cols/2) for row in range(rows): for col in range(mirror_col): image[row, col, :] = image[row, mirror_col-col,:]cv2.imshow(mirror image, image)cv2.waitKey()cv2.destroyAllWindows()
額,失敗了。雖然對稱,但並沒有按照心想的中間線程左右對稱。
1.7圖像灰度
圖片灰度化原理是,彩色圖像中的每個像素顏色由B、G、R三個分量決定,範圍都是(0,255)。灰度圖像B、G、R三個分量都相同的一種圖像。
實現方法:
- 均值法 求出三分量加總後的均值,賦值到三分量上去
- 公式法根據RGB變換公式 gray = 0.3R+0.59G+0.11B 將gray賦值到三個分量上去。
- OpenCV有cvtColor方法,可以完成灰度化。
1.7.1均值法
import numpy as npimport cv2image = cv2.imread(測試頭像路徑)rows = image.shape[0]cols = image.shape[1] for row in range(rows): for col in range(cols): average = np.mean(image[row,col,:]) image[row, col, :] = averagecv2.imshow(average image, image)cv2.waitKey()cv2.destroyAllWindows()
1.7.2公式法
import numpy as npimport cv2image = cv2.imread(測試頭像圖片路徑)rows = image.shape[0]cols = image.shape[1] for row in range(rows): for col in range(cols): gray = 0.11*image[row,col,0]+0.59*image[row,col,1]+0.3*image[row,col,2] image[row, col, :] = graycv2.imshow(formula image, image)cv2.waitKey()cv2.destroyAllWindows()
1.7.3 cvtColor灰度化
import numpy as npimport cv2image = cv2.imread(測試頭像圖片路徑)cvt_image = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)cv2.imshow(cvtColor image, cvt_image)cv2.waitKey()cv2.destroyAllWindows()
1.8 圖片加噪
加噪->圖片變的不清晰。
原理:隨機的將素點替換為其他值,比如[225,20,19]
import numpy as npimport cv2image = cv2.imread(測試頭像路徑)rows = image.shape[0]cols = image.shape[1] #給圖片隨機加加5000個噪點noises = 5000 for i in range(noises): #從(0,rows)或(0,cols)隨機生成一個整數 row = np.random.randint(0, rows) col = np.random.randint(0, cols) image[row, col, :] = np.array([225,20,19])cv2.imshow(noise image, image)cv2.waitKey()cv2.destroyAllWindows()
下載源碼可關註:
公眾號:大鄧帶你玩PYTHON
推薦閱讀:
※數據分析入門必看案例:泰坦尼克號倖存率研究
※深入淺出區塊鏈(1)介紹
※基於TCP的python聊天程序
※學會最簡單的資料庫|看完這7招就夠了
※Python 高級編程:理解生成器