OpenCV:圖片操作基本知識

歡迎關注公眾號大鄧帶你玩Python

圖像基本知識

圖像是由像素組成的,而像素實際上就是帶有坐標位置和顏色信息的點。我們把圖片想像成由若干行,若干列的點組成的, 現實中有RGB顏色系統,我們可以把圖中任意一點(位置在第m行,第n列)的點A表示為

A[m,n] = [blue,green,red]

圖片數據解讀

A[m,n] = [blue,green,red]

參數 |解讀

m |A點在圖像中的第m行

n |A點在圖像中的第n列

blue |表示藍色,三原色(RGB)的第一個數值

green|表示綠色,三原色(RGB)的第二個數值

red |表示紅色,三原色(RGB)的第一個數值

一、OpenCV-python基本操作

1.1讀入圖像文件

import cv2img_path = "test.jpg"image = cv2.imread(filename=img_path) #winname彈出窗口的名字,mat為傳入的圖片對象cv2.imshow(winname="show the image",mat=image) #窗口默認一直處於彈出窗狀態cv2.waitKey() #按任意鍵盤,銷毀窗口cv2.destroyAllWindows()

1.2我們先檢驗下圖片數據類型

在一開始我們說圖片是由像素組成的,我們可以先檢驗下讀入的圖片數據是什麼類型數據,長什麼樣?

其實讀入的是數組,不信你看下面

>>>import cv2>>>img_path = "test.jpg" >>>image = cv2.imread(filename=img_path) >>>print(type(image)) >>><class "numpy.ndarray">#image這個數據是三維的>>>print(image.ndim)>>>3

image的shape

800行,480列的點組成的圖片,RGB三色,圖片為彩色

>>>print(image.shape) >>>(800,480,3)

我們檢查下第5行,第6列像素的值

>>>print(image[4,5]) >>>[161 185 221] >>>print(type(image[4,5])) >>><class "numpy.ndarray">

好像很複雜,但實際上就是ndarray數組,對此有疑惑的可以看看我公眾號的numpy基本知識。

1.3獲取圖片尺寸

首先我們查看測試圖片的詳情

這個圖片選自iphone7壁紙,最大數800肯定是高,寬是480。

那麼問題來了,我們如何通過程序運行獲得圖片的尺寸?

>>>import cv2>>>img_path = "/test.jpg" >>>image = cv2.imread(filename=img_path) >>>print(image.shape) >>>(800, 480, 3)

程序返回(800, 480, 3),說明image.shape返回的元組中第一個參數是高,第二個是寬。請記住!

1.4圖像亮度

blue,green,red分別代表藍綠紅,每個數值代表的原色的亮度大小。

blue,green,red值越大,圖像越亮,當[255,255,255]時,圖像為純白色。越小,圖像越黑暗,當[0,0,0]時,圖像為純黑。

搞明白這點,我們把原圖分別調亮50%,調黑50%如圖。即將green,blue,red數值乘以1.5或0.5 。

import cv2import osimg_path = "test.jpg"image = cv2.imread(filename=img_path)cv2.imshow(winname="raw image",mat=image) #獲取圖片像素數組的行數和列數row_num = image.shape[0]column_num = image.shape[1] #對image數據進行複製bright_image = image.copy() #對像素blue/green/red值整體變為原來的1.5倍,圖片變亮 for row in range(row_num): for column in range(column_num): bright_image[row, column, 0] = bright_image[row, column, 0]* 1.5 bright_image[row, column, 1] = bright_image[row, column, 1] * 1.5 bright_image[row, column, 2] = bright_image[row, column, 2] * 1.5cv2.imshow(winname="show bright image",mat=bright_image)black_image = image.copy() #對像素blue/green/red值整體變為原來的0.5倍,圖片變黑暗 for row in range(row_num): for column in range(column_num): black_image[row, column, 0] = black_image[row, column, 0]* 0.5 black_image[row, column, 1] = black_image[row, column, 1] * 0.5 black_image[row, column, 2] = black_image[row, column, 2] * 0.5cv2.imshow(winname="show black image",mat=black_image)cv2.waitKey()cv2.destroyAllWindows()

中間為原圖,左側為調亮30%後的效果,右側為調黑30%的效果。

1.5 製作日落效果圖

觀看了《機器學習實踐指南》,裡面有個將圖片製作成日落效果的案例。只需要把blue、green值變為原來的70%即可實現日落效果。

import cv2img_path = "test.jpg"image = cv2.imread(filename=img_path) #顯示原圖cv2.imshow(winname="raw image",mat=image)row_num = image.shape[0]column_num = image.shape[1] #日落效果,將藍色與綠色調整為原來的70% for row in range(row_num): for column in range(column_num): image[row, column, 0] = image[row, column, 0]* 0.7 image[row, column, 1] = image[row, column, 1] * 0.7 #顯示日落效果圖cv2.imshow(winname="show sunload image",mat=image)cv2.waitKey()cv2.destroyAllWindows()

左側為原圖,右側為日落效果圖。

1.6在圖片上輸出文本

使用cv2.putText即可在圖片中添加文字。

cv2.putText(img,text,org,fontFace,fontScale,color)

參數 |解讀

img |cv2讀入的圖片數據

txt |要寫入的文本

org |文字在圖片中的坐標。坐標原點位於圖片左上角。如org=(100,400),從圖片 最左邊起100,從最最上面往下400。

fontFace|字體。如cv2.FONT_HERSHEY_TRIPLEX、cv2.FONT_HERSHEY_PLAIN

color |顏色,三原數組,使用RGB模式編碼。如白色為(255,255,255)

import cv2img_path = "test.jpg"image = cv2.imread(filename=img_path)cv2.imshow(winname="raw image",mat=image)#文字在圖中的坐標(注意:這裡的坐標原點是圖片左上角)x, y = 100, 400cv2.putText(img = image, text = "Beautiful Scene!", org = (x, y), fontFace = cv2.FONT_HERSHEY_TRIPLEX, fontScale = 1, color = (255,255,255))cv2.imshow(winname="add text on image",mat=image)cv2.waitKey()cv2.destroyAllWindows()

左側為原圖,右側為加文字的圖片效果。Beautiful Scene

1.7縮放圖片

使用下面方法縮放圖片

resize(src, dsize, fx, fy)

參數 |解讀

src |讀入的圖片數據

dsize |輸出圖片的尺寸。如果dsize為None(或0),程序會默認執行disze=(fx*src*cols,fy*src*rows)

fx |圖片水平方向的縮放比例(倍數)

fy |圖片垂直方向的縮放比例(倍數)

import cv2import osimg_path = "test.jpg"image = cv2.imread(filename=img_path) #顯示原圖cv2.imshow(winname="raw image",mat=image) #更改fx,fy即可改變圖片比例。垂直方向fy大小不變,水平方向fx變為原來的0.5倍。smaller_image = cv2.resize(src=image,dsize=None,fx=0.5,fy=1)cv2.imshow(winname="smaller image",mat=smaller_image)cv2.waitKey()cv2.destroyAllWindows()

右側為原圖,左側為縮小後的圖片(水平變原圖的0.5倍,垂直方向保持不變。)

圖像的旋轉

getRotationMatrix2D(center, angle, scale),這個函數需要三個參數,旋轉中心,旋轉角度,旋轉後圖像的縮放比例

import cv2image_path = "test.jpg"image = cv2.imread(filename=image_path)rows,cols = image.shape[:2] #第一個參數旋轉中心,第二個參數旋轉角度,第三個參數:縮放比例M = cv2.getRotationMatrix2D((cols/2,rows/2), 10, 0.4) #第三個參數:變換後的圖像大小new_image = cv2.warpAffine(image,M,(rows,cols))cv2.imshow("raw image",image)cv2.imshow("new_image",new_image)cv2.waitKey()cv2.destroyAllWindows()

左側為原圖,右側為以圖片中心旋轉10,尺寸為原圖0.4倍,操作後的圖片

歡迎關注公眾號大鄧帶你玩Python

推薦閱讀:

Python 機器學習之 SVM 預測買賣(標的物:比特幣)
Python魔法方法指南
【深度技術】小試牛刀:使用Python模擬登錄知乎
認準目標,前進

TAG:Python | Python库 | Python入门 |