Opencv第六課--圖像的運(yùn)算

數(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")
#可以通過(guò)像素點(diǎn)讀取
px = img[100,100]
#返回的是一個(gè)RGB的三維向量

上面的例子是對(duì)一副輸入圖像的像素值進(jìn)行讀取,下面通過(guò)接口快速實(shí)現(xiàn)對(duì)像素值的修改

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)常需要訪問(wèn)圖像的一些屬性,包括行、列,大小,類型

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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容