數(shù)字圖像的運(yùn)算
圖像處理中最重要的內(nèi)容之一就是圖像的運(yùn)算份名,圖像像素的運(yùn)算包括點(diǎn)運(yùn)算、代數(shù)運(yùn)算妓美、邏輯運(yùn)算僵腺,圖像的幾何變換方法包括平移、鏡像壶栋、縮放辰如、轉(zhuǎn)置、旋轉(zhuǎn)和剪切贵试,圖像的鄰域操作和區(qū)域選擇琉兜。
獲取和修改
import cv2
import numpy as np
img = cv2.imread("test.jpg")
#可以通過像素點(diǎn)讀取
px = img[100,100]
#返回的是一個(gè)RGB的三維向量
上面的例子是對一副輸入圖像的像素值進(jìn)行讀取,下面通過接口快速實(shí)現(xiàn)對像素值的修改
import cv2
import numpy as np
img = cv2.imread("test.jpg")
print(img.item(10,10,2))
img.itemset((10,10,2),100)
print(img.item(10,10,2))
當(dāng)然經(jīng)常需要訪問圖像的一些屬性锡移,包括行呕童、列,大小淆珊,類型
import cv2
img = cv2.imread("test.jpg")
print(img.shape)
##(280,450,3)
print(img.size)
##12600
print(img.dtype)
##uint8
圖像加法
cv2.add()是將兩幅圖像進(jìn)行加法運(yùn)算
圖像混合
image.png
cv2.addWeighted()就是按照這個(gè)公式進(jìn)行混合操作的夺饲,實(shí)現(xiàn)不同比例的一種圖像混合。
import cv2
import numpy as np
img1 = cv2.imread("test1.jpg")
img2 = cv2.imread("test2.jpg")
dst = cv2.addWeighted(img1,0.7,img2,0.3,0)
cv2.imshow("dst",dst)
cv2.waitKey(0)
cv2.destroyAllWindow()
幾何變換
擴(kuò)展縮放
cv2.resize()可以實(shí)現(xiàn)這個(gè)功能
import numpy as np
import cv2
img = cv2.imread("test.jpg")
res = cv2.resize(img,None,fx=2,fy=2,interpolation=cv2.INTER_CUBIC)
cv2.imshow("res",res)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
平移
import cv2
import numpy as np
img = cv2.imread("test.jpg")
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
mode = imgInfo[2]
dst = np.zeros(imgInfo,np.uint8)
for i in range(height):
for j in range(width-100):
dst[i,j+100] = img[i,j]
cv2.imshow("dst",dst)
cv2.imshow("img",img)
cv2.waitKey(0)
cv2.destroyAllWindows()
image.png
原始圖像向右移動(dòng)100個(gè)像素
旋轉(zhuǎn)
def rotation():
img = cv2.imread("test.jpg",0)
rows,cols = img.shape
#第一個(gè)是旋轉(zhuǎn)中心,第二個(gè)是旋轉(zhuǎn)角度往声,第三個(gè)是旋轉(zhuǎn)縮放因子
M = cv2.getRotationMatrix2D((cols/2,rows/2),45,0.6)
dst = cv2.warpAffine(img,M,(2*cols,2*rows))
while(1):
cv2.imshow("dst",dst)
cv2.imshow("img",img)
if cv2.waitKey(1)&0xFF==27:
break
cv2.destroyAllWindows()
if __name__ == "__main__":
rotation()
仿射變換
def warpAffine():
img = cv2.imread("test.jpg")
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
#原圖的三個(gè)坐標(biāo)
matSrc = np.float32([[0,0],[0,height-1],[width-1,0]])
#仿射圖的三個(gè)坐標(biāo)
matDst = np.float32([[50,50],[100,height-50],[width-200,100]])
matAffine = cv2.getAffineTransform(matSrc,matDst)
dst = cv2.warpAffine(img,matAffine,(height,width))
cv2.imshow("dst",dst)
while(1):
if cv2.waitKey(1)&0xFF==27:
break
cv2.destroyAllWindows()
if __name__ == "__main__":
warpAffine()