1. 圖像的讀取,顯示和保存
首先在python中安裝opencv, 在終端命令行輸入pip install opencv-python 即可。
#導入cv2的庫
import cv2 as cv
#圖像讀取
img = cv.imread(“img.jpg”)
#顯示圖像
cv.imshow(“img”, img)
#使圖像持久顯示在桌面上
cv.waitKey(0)
cv.destroyAllWindows()
#將圖像保存到pictures 目錄下,名稱爲pic.jpg
cv.imwrite(“pictures/pic.jpg”, img)
2.像素值的讀取
- 圖像可以分爲二值圖像, 灰度圖像, 彩色圖像。
二值圖像的像素值非黑即白。
灰度圖像的像素值在0-255之間,只有一個通道。
彩色圖像的像素值也在0-255之間, 由三個通道組成,在opencv中分別是G,B, R 即綠藍紅。
獲取圖像的某快區域,並將改變其像素。
import cv2 as cv
import numpy as np
img = cv.imread("java.jpg")
img[100: 150, 100: 150] = 255
cv.imwrite("java_changd.jpg", img)
cv.imshow("img_changed", img)
cv.waitKey(0)
cv.destroyAllWindows()
- 獲取單個像素點
灰度圖像
import cv2 as cv
import numpy as np
#cv.IMREAD_GRAYSCALE,這個參數表示以灰度圖方式讀入,也可以直接寫0代替。 寫這個參數默認以彩色形式讀入,這時候不會將灰色圖自動上色,而是將單通單轉成三通道。
img = cv.imread("java.jpg", cv.IMREAD_GRAYSCALE)
#使用img.item() 來讀取像素點,參數是座標值
pix = img.item(45, 50)
print(pix) # 2
import cv2 as cv
import numpy as np
img = cv.imread("java.jpg")
#彩色圖像有三個通道,blue讀取藍色通道的像素點,green 讀取green通道的像素值
blue = img.item(45, 45, 0)
green = img.item(45, 45, 1)
red = img.item(45, 45, 2)
print(blue)
print(green)
print(red)
#打印結果
#
5
3
2
3. 獲取圖像的屬性
得到圖像的形狀,總的像素的大小,像素的數據類型
import cv2 as cv
import numpy as np
img = cv.imread("java.jpg")
print(img.shape) #圖片的形狀
print(img.size)#圖像大小,長度, 寬度和高度乘積
print(img.dtype)#0-255是無符號的8位二進制
"""
(300, 532, 3)
478800
uint8
"""
彩色圖像的通道拆分
import cv2 as cv
import numpy as np
img = cv.imread("java.jpg")
#分別取出圖像的三個通道的值,每個通道是2維的
blue, green, red = cv.split(img)
print(blue.shape)
print(green.shape)
print(red.shape)
cv.imshow("img", img)
cv.imshow("blue", blue)
cv.imshow("green", green)
cv.imshow("red", red)
cv.waitKey(0)
cv.destroyAllWindows()
4. 像素的運算
圖像放縮 ,修改圖像的大小cv.resize()
import cv2 as cv
import numpy as np
# read images
img1 = cv.imread("java.jpg")
# 第一種方法, 直接輸入原圖像的要修改的大小
resize1 = cv.resize(img1, (300, 300))
# 第二種方法,按照比例縮放,None表示不指定新的shape, 而是通過比例縮放
resize2 = cv.resize(img1, None, fx=1.2, fy=0.5)
print(resize1.shape)
print(resize2.shape)
cv.waitKey(0)
cv.destroyAllWindows()
將兩幅圖像進行加法運算,np.add() 和cv2.add() 都可以完成加法預案算, 但結果有所不同, np.add() 會將加法運算後超過255的像素進行取模運算, 如結果是256 , 則爲了避免像素值在0-255之間, 會進行取模運算, 即 256 % 255 = 1.
cv2.add() 會把超過255的值當做255處理
image1
image2
np.add() 的結果
cv.add() 的結果
import cv2 as cv
import numpy as np
# read images
img1 = cv.imread("java.jpg")
img2 = cv.imread("yese.jpg")
# cv.resize() 修改圖像的大小,在進行運算之前要先將圖像修剪成統一大小
img1 = cv.resize(img1, (300, 300))
img2 = cv.resize(img2, (300, 300))
add1 = np.add(img1, img2)
add2 = cv.add(img1, img2)
cv.imshow("img1", img1)
cv.imshow("img2", img2)
cv.imshow("add1", add1)
cv.imshow("add2", add2)
cv.imwrite("add1.jpg", add1)
cv.imwrite("add2.jpg", add2)
cv.waitKey(0)
cv.destroyAllWindows()
圖像融合
使用cv.addWeighted()將兩幅圖像進行加權融合。
import cv2 as cv
import numpy as np
# read images
img1 = cv.imread("java.jpg")
img2 = cv.imread("yese.jpg")
img1 = cv.resize(img1, (300, 300))
img2 = cv.resize(img2, (300, 300))
# img1 * 0.3 + img2 * 1 , 最後一個參數表示亮度調整, 0代表不做改變, 也不能省略
add = cv.addWeighted(img1, 0.3, img2, 1, 0)
cv.imwrite("add.jpg", add)
cv.imshow("add_weighted", add)
cv.waitKey(0)
cv.destroyAllWindows()
圖像翻轉
cv.flip()
import cv2 as cv
import numpy as np
# read images
img = cv.imread("java.jpg")
# 第二個參數控制翻轉的方向
img1 = cv.flip(img, 1)
cv.imshow("img", img)
cv.imshow("img1", img1)
cv.imwrite("flip.jpg", img1)
cv.waitKey(0)
cv.destroyAllWindows()
原圖
翻轉後的圖像
import cv2 as cv
import numpy as np
# read images
img = cv.imread("java.jpg")
# 第二個參數控制翻轉的方向
img1 = cv.flip(img, 0)
cv.imshow("img", img)
cv.imshow("img1", img1)
cv.imwrite("flip.jpg", img1)
cv.waitKey(0)
cv.destroyAllWindows()