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)

猜你喜欢

转载自blog.csdn.net/weixin_42105432/article/details/84937247