1. 程式人生 > >OpenCV(3)圖片變換和圖片特效

OpenCV(3)圖片變換和圖片特效

(1)圖片縮放
圖片的縮放常用於圖片的預處理,對圖片進行歸一化大小。這裡採用OpenCV庫進行實現。
cv.resize()實現圖片縮放(預設雙線性插值法),固定大小

import cv2 as cv
import numpy as np
img = cv.imread("dog.jpg",1) #讀取一張大小未知的彩色圖
img1 = cv.resize(img,(100,200))  #將原圖變換成寬100,高200的圖片。
print(img1.shape)  #(200,100,3)
cv.imshow("img1",img1)

cv.warpAffine()實現縮放
縮放矩陣:[[A1,A2,B1],[A3,A4,B2]]
newX=A1x+A2y+B1
newY=A3

x+A4*y+B2.一般A用於縮放,B用於移位。

import cv2 as cv
import numpy as np
img = cv.imread("dog.jpg",1)
(height,width,deep) = img.shape
#定義變換矩陣A
A = np.array([[0.5,0,0],[0,0.5,0]],np.float)  #0.5代表縮小一倍
#warpAffine方法實現
img1 = cv.warpAffine(img,A,(int(width/2),int(height/2)) )
cv.imshow("img1",img1)

(2) 圖片剪下

import cv2 as cv
img = imread("dog.jpg",1)
img1 = img[100:300,200:400]  #剪下行(高)從100到300,列(寬)從200到400
cv.imshow("img1",img1)

(3)影象旋轉

import cv2 as cv
img = imread("dog.jpg",1)
(height,width,deep) = img.shape
#定義變換矩陣A
A=cv.getRotationMatrix2D((width/2,height/2),45,0.6) #引數:(中心點,旋轉角度,縮放比)
#warpAffine實現旋轉
img1 = cv.warpAffine(img,A,(width,height)) 
cv.imshow("img1",img)

(4)灰度處理
1、cv.cvtColor()方法

import cv2 as cv
img = imread("dog.jpg",1)
img1 = cv.cvtColor(img,cv.COLOR_BGR2GRAY)  #實現BGR到GRAY的轉換
cv.imshow("img1",img1)

2、直接讀取單通道圖片

import cv2 as cv
img = imread("dog.jpg",0)
cv.imshow("img",img)

(5)圖片灰度反轉

import cv2 as cv
import numpy as np
img = cv.imread("dog.jpg",1)
(height,width,deep) = img.shape
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
img1 = np.zeros((height,width,1),np.uint8)
for i in range(height):
    for j in range(width):
        temp = gray[i,j]
        img1[i,j] = 255-temp  #反轉
cv.imshow("img1",img1)

(6)圖片彩色反轉

import cv2 as cv
import numpy as np
img = cv.imread("dog.jpg",1)
(height,width,deep) = img.shape
img1 = np.zeros((height,width,deep),np.uint8)
for i in range(height):
    for j in range(width):
        (b,g,r) = img[i,j]
        img1[i,j] = (255-b,255-g,255-r)  #反轉
cv.imshow("img1",img1)

(7)馬賽克效果
馬賽克效果的原理:n*n畫素塊的值取成相同

import cv2 as cv
import numpy as np
img = cv.imread("dog.jpg",1)
(height,width,deep) = img.shape
value = 8  #馬賽克大小
for i in range(100,300,value):
	for j in range(100,300,value):  #將高100-300寬100-300之間打上馬賽克
		for m in range(value):
			for n in range(value):
				(b,g,r) = img[i,j]
				img[m+i,n+j] = (b,g,r)
cv.imshow("img",img)

(8)毛玻璃效果
每個畫素點取領域塊中的隨機一個畫素

import cv2 as cv
import numpy as np
img = cv.imread("dog.jpg",1)
(height,width,deep) = img.shape
img1 = np.zeros((height-4,width-4,3),np.uint8)  
for m in range(height-4):
    for n in range(width-4):
        index = int(np.random.uniform(0,1)*4)
        (b,g,r) = img[m+index,n+index]
        img1[m,n] = (b,g,r)
cv.imshow("img1",img1)

(9)邊緣檢測

#1、灰度處理 2、高斯濾波(去燥) 3、canny方法計算
img = cv.imread("dog.jpg",1)
imfo = img.shape
height = imfo[0]
width = imfo[1]
gray = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
imgG = cv.GaussianBlur(gray,(3,3),0)  #高斯濾波
img1 = cv.Canny(imgG,50,50)  #後兩個引數為判決門限
cv.imshow("img1",img1)