参考书目:《OpenCV计算机视觉基础教程》–夏帮贵。
代码编写:Jupyter Notebook。



# 1.缩放
# 语法格式:dst = cv2.resize(src, dsize[, dst[, fx[, fy[, interpolation]]]])
# 参数说明:
# a.dst:转换后的图像;
# b.src:用于缩放的原图像;
# c.dsize:转换后图像大小;
# d.fx:水平方向的缩放比例;
# e.fy:垂直方向的缩放比例;

# f.interpolation:插值方式;
# 插值方式:
# 1.cv2.INTER_NEAREST:最近邻插值;
# 2.cv2.INTER_LINEAR:双线性插值,默认方式;
# 3.cv2.INTER_CUBIC:3次样条插值;
# 4.cv2.INTER_AREA:区域插值;
# 5.cv2.INTER_LANCZOS4:Lanszos插值;
# 6.cv2.INTER_LINEAR_EXACT:位精确双线性插值;
# 7.cv2.INTER_MAX:插值编码掩码;
# 8.cv2.WARP_FILL_OUTLIERS:标志,填充目标图像中的所有像素;
# 9.cv2.WARP_INVERSE_MAP:标志,逆变换;
import cv2 as cv

img1 = cv.imread("apple.jpg")
img2 = cv.resize(img1, None,fx = 0.5,fy = 0.5)    # 缩放到fx = 0.5,fy = 0.5;

cv.imshow("apple", img1)
cv.imshow("0.5apple", img2)

cv.waitKey(0)

1

# 2.翻转
# 语法格式:dst = cv2.flip(src, flipCode)
# 参数说明:
# a.dst:转换后的图像;
# b.src:原图像;
# c.flipCode:翻转类型;
# flip = 0:绕x轴翻转;flip大于0的整数时,绕y轴翻转;flip小于0的整数时,绕x轴和y轴同时翻转;
import cv2 as cv

img1 = cv.imread("apple.jpg")

while True:
    """
    程序功能:
    按【0】显示原图;
    按【1】垂直翻转;
    按【2】水平翻转;
    按【3】水平、垂直同时翻转;
    按【ESC】退出;
    """
    key = cv.waitKey() & 0xFF
    if key == 48:
        img2 = img1
    elif key == 49:
        img2 = cv.flip(img1, 0)
    elif key == 50:
        img2 = cv.flip(img1, 1)
    elif key == 51:
        img2 = cv.flip(img1, -1)
    cv.imshow("apple_flip", img2)
    if key == 27:
        break
cv.destroyAllWindows()

2

# 3.仿射
# 放射变换:平移、旋转、缩放;特点:原图像中的所有平行线在转换后的图像仍然平行;
# 语法格式:dst = cv2.warpAffine(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]])
# 参数说明:
# a.dst:转换后的图像,图像类型和原图像一致,大小由dsize决定;
# b.src:原图像;
# c.M:一个2×3的转换矩阵,使用不同的转换矩阵可实现平移、旋转等多种操作;
# d.dsize:转换后的图像大小;
# e.flags:插值方式,默认值:cv2.INTER_LINEAR;
# f.borderMode:边类型,默认值:cv2.BORDER_CONSTANT;
# g.borderValue:边界值,默认值:0;
1.平移
  1. 平移:将图像沿着水平或垂直方向移动一定的像素;
  2. 假设将图像水平移动mmm个像素,垂直移动nnn个像素,则图像转换矩阵公式:dst(x,y)=src(x+m,y+n)dst(x, y) = src(x+m, y+n)dst(x,y)=src(x+m,y+n),转换矩阵如下:
    M=[10m01n] M=\begin{bmatrix}1 & 0 & m \\ 0 & 1 & n\end{bmatrix} M=[1001mn]
import numpy as np
import cv2 as cv

img1 = cv.imread("apple.jpg")

height = img1.shape[0]    # 图像高度
width = img1.shape[1]     # 图像宽度
dsize = (width, height)
m1 = np.float32([[1, 0, 100], [0, 1, 50]])
m2 = np.float32([[1, 0, -100], [0, 1, -50]])

img2 = cv.warpAffine(img1, m1, dsize)
img3 = cv.warpAffine(img1, m2, dsize)

cv.imshow("apple", img1)
cv.imshow("apple_translation1", img2)
cv.imshow("apple_translation2", img3)

cv.waitKey(0)

3

2.缩放
  1. 假设图像的宽度缩放比例为hhh,高度缩放比例为vvv,根据图像转换矩阵运算公式,缩放转换矩阵为:
    M=[h000v0] M=\begin{bmatrix}h & 0 & 0 \\ 0 & v & 0\end{bmatrix} M=[h00v00]
import cv2 as cv
import numpy as np

img1 = cv.imread("apple.jpg")
height = img1.shape[0]
width = img1.shape[1]
dsize = (width, height)

m1 = np.float32([[0.5, 0, 0], [0, 0.5, 0]])
m2 = np.float32([[0.25, 0, 0], [0, 0.25, 0]])

img2 = cv.warpAffine(img1, m1, dsize)
img3 = cv.warpAffine(img1, m2, dsize)

cv.imshow("apple", img1)
cv.imshow("apple_scale1", img2)
cv.imshow("apple_scale2", img3)

cv.waitKey(0)

4

3.旋转
  1. 执行旋转的函数:cv2.getRotationMatrix2D()cv2.getRotationMatrix2D()cv2.getRotationMatrix2D()
  2. 语法格式:m=cv2.getRotationMatrix2D(center,angle,scale)m = cv2.getRotationMatrix2D(center, angle, scale)m=cv2.getRotationMatrix2D(center,angle,scale)
  3. 参数说明:
    • centercentercenter:原图像中作为旋转中心的坐标;
    • angleangleangle:旋转角度,正数表示逆时针方向旋转,负数表示顺时针方向旋转;
    • scalescalescale:目标图像与原图像的大小比例;
  4. 假设原图像宽度为widthwidthwidth,高度为heightheightheight,将图像中心作为旋转中心顺时针旋转60°,将图像缩小50%,则计算矩阵如下:
    m=cv2.getRotationMatrix2D((width/2,height/2),−60,0.5) m=cv2.getRotationMatrix2D((width / 2, height / 2), -60, 0.5) m=cv2.getRotationMatrix2D((width/2,height/2),60,0.5)
import cv2 as cv

img1 = cv.imread("apple.jpg")
height = img1.shape[0]
width = img1.shape[1]
dsize = (width, height)

m1 = cv.getRotationMatrix2D((width / 2, height / 2), -60, 0.5)
m2 = cv.getRotationMatrix2D((width / 2, height / 2), 60, 0.5)

img2 = cv.warpAffine(img1, m1, dsize)
img3 = cv.warpAffine(img1, m2, dsize)

cv.imshow("apple", img1)
cv.imshow("apple_rotation1", img2)
cv.imshow("apple_rotation2", img3)

cv.waitKey(0)

5

4.三点映射变换
  1. 三点映射变换:将图像转换为任意的平行四边形;
  2. 计算转换矩阵函数:cv2.getAffineTransform()cv2.getAffineTransform()cv2.getAffineTransform()
  3. 语法格式:m=cv2.getAffineTransform(src,dst)m=cv2.getAffineTransform(src, dst)m=cv2.getAffineTransform(src,dst)
  4. 参数说明:
    • srcsrcsrc:原图像中3个点的坐标;
    • dstdstdst:原图像中3个点在目标图像中的对应坐标;
import cv2 as cv
import numpy as np

img1 = cv.imread("apple.jpg")
height = img1.shape[0]
width = img1.shape[1]
dsize = (width, height)

src = np.float32([[0, 0], [width - 20, 0], [0, height - 5]])
dst = np.float32([[50, 50], [width - 100, 80], [100, height - 100]])

m = cv.getAffineTransform(src, dst)
img2 = cv.warpAffine(img1, m, dsize)

cv.imshow("apple", img1)
cv.imshow("apple_trans", img2)

cv.waitKey(0)

6

# 4.透视
# 透视:将图像转换为任意四边形;
# 透视特点:原始图像中的所有直线在转换后的图像仍然是直线;
# 语法格式:dst = cv2.warpPerspective(src, M, dsize[, flags[, borderMode[, borderValue]]]);
# 参数说明:
# a.dst:转换后的图像;
# b.src:用于缩放的原图像;
# c.M:大小为3×3的转换矩阵;
# d.dsize:转换后图像大小;
# e.flags:插值方式,默认值:cv2.INTER_LINEAR;
# f.borderMode:边类型,默认值:cv2.BORDER_CONSTANT;
# g.borderValue:边界值,默认值:0;

# 计算透视变换使用的转换矩阵:
# 语法格式:M = cv2.getPerspectiveTransform(src, dst)
# 参数说明:
# a.src:原图像中4个点的坐标;
# b.dst:原图像中4个点在转换后的目标图像中的对应坐标;
import cv2 as cv
import numpy as np

img1 = cv.imread("apple.jpg")
height = img1.shape[0]
width = img1.shape[1]
dsize = (width, height)

src = np.float32([[0, 0], [width - 10, 0], [0, height - 10], [width - 1, height - 1]])
dst = np.float32([[50, 50], [width - 50, 80], [50, height - 100], [width - 100, height - 10]])

m = cv.getPerspectiveTransform(src, dst)
img2 = cv.warpPerspective(img1, m, dsize)

cv.imshow("apple", img1)
cv.imshow("apple_perspective", img2)

cv.waitKey(0)

8

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐