(进阶向)Python第十四期OpenCv图像预处理方法[2]

发布于:2025-07-25 ⋅ 阅读:(17) ⋅ 点赞:(0)

目录

1、图像的翻转

2、图像的仿射变化

 2.1 旋转方法

2.2 图像的平移,向右下角平移

2.2 图像的缩放

3、图像的插值与填充

 3.1 边界复制填充,最近邻插值与原图对比

​编辑​编辑

3.2 边界反射填充,双线性插值与原图对比

3.3 边界反射101填充,双三次插值与原图对比

3.4 边界常数填充,lanczos4插值与原图的对比

3.5 边界包裹填充,像素区域插值与原图对比

4、图像的透视变换矩阵(矫正图片)

5、图像制作掩膜


引言:这一期继续看API方法,包括图像的旋转,填充,以及数学类方法的使用。

1、图像的翻转

————在opencv中图像的翻转是以镜像为中心的原点进行旋转的,通过选择我们可以获得与原图的镜像对比图,通过cv.flip(img,flipcode)方法来实现,flipcode的值不同对应的翻转方式也不同;

实例操作: 

import cv2 as cv
import numpy as np

image1 = cv.imread("../images/a.png")
img = cv.resize(image1, (300, 300))
cv.imshow("image1", img)
#翻转 镜像翻转 以图像中心为原点cv。flip(img, flipCode)
image2 = cv.flip(img, 0)#垂直翻转 沿x轴翻转
cv.imshow("image2", image2)
#filpcode = 1 水平翻转 沿y轴翻转
flip1 = cv.flip(img, 1)
cv.imshow("flip1", flip1)
#filpcode = -1 180度旋转
flip2 = cv.flip(img, -1)
cv.imshow("flip2", flip2)

2、图像的仿射变化

————仿射变化是指在OpenCV中的一种线性变化,保持了点距相对距离不会改变。包括旋转、平移、缩放、剪切等;利用cv.warpAffine()方法函数来实现;

 2.1 旋转方法

import cv2 as cv

cat = cv.imread("../images/1.jpg")
#获取旋转矩阵 cv.getRotatationMatrix2D(旋转中心, 旋转角度, 缩放因子)
M = cv.getRotationMatrix2D((260,260), -45, 1)
cat2 = cv.warpAffine(cat, M, (520,520))
cv.imshow("cat", cat)
cv.imshow("cat2", cat2)
cv.waitKey(0)
cv.destroyAllWindows()

 

2.2 图像的平移,向右下角平移

import cv2 as cv
import numpy as np

cat = cv.imread("../images/1.jpg")
cat = cv.resize(cat, (520,520))

#定义平移矩阵
tx = 80
ty = 120
M = np.float32([[1,0,tx],[0,1,ty]])
#实现仿射变化
cat_move = cv.warpAffine(cat, M, (400,400))
cv.imshow("cat", cat)
cv.imshow("cat_move", cat_move)


cv.waitKey(0)
cv.destroyAllWindows()

 

2.2 图像的缩放

import cv2 as cv
import numpy as np

cat = cv.imread("../images/1.jpg")
cat = cv.resize(cat, (520,520))


sx = 0.5
sy = 1
x = 80
y = 120
M = np.float32([[sx,0,x],[0,sy,y]])
cat_zoom = cv.warpAffine(cat, M, (540,540))
cv.imshow("cat", cat)
cv.imshow("cat_zoom", cat_zoom)


cv.waitKey(0)
cv.destroyAllWindows()

 

3、图像的插值与填充

————在图像处理和计算机图形学中,插值(Interpolation)是一种通过已知数据点之间的推断或估计来获取新数据点的方法。它在图像处理中常用于处理图像的放大、缩小、旋转、变形等操作,以及处理图像中的像素值。图像插值算法是为了解决图像缩放或者旋转等操作时,由于像素之间的间隔不一致而导致的信息丢失和图像质量下降的问题。当我们对图像进行缩放或旋转等操作时,需要在新的像素位置上计算出对应的像素值,而插值算法的作用就是根据已知的像素值来推测未知位置的像素值。

import cv2 as cv

#读图
cat = cv.imread("../images/pig.png")

w = cat.shape[1]
h = cat.shape[0]
#旋转
#获取旋转矩阵
M = cv.getRotationMatrix2D((w//2,h//2), 45, 0.5)
#仿射变换
dst = cv.warpAffine(cat, M, (w,h),cv.INTER_NEAREST,borderMode=cv.BORDER_REPLICATE)#最近的插值
cv.imshow("dst", dst)#边界复制填充
dst1 = cv.warpAffine(cat, M, (w,h),cv.INTER_LINEAR,borderMode=cv.BORDER_REFLECT)#双线性插值 单线性插值 插两次:水平、垂直
cv.imshow("dst1", dst1)#边界反射填充
dst2 = cv.warpAffine(cat, M, (w,h),cv.INTER_CUBIC,borderMode=cv.BORDER_REFLECT_101)#双三次插值 16个 4*4 wi wj
cv.imshow("dst2", dst2)#边界反射101填充
dst3 = cv.warpAffine(cat, M, (w,h),cv.INTER_LANCZOS4,borderMode=cv.BORDER_CONSTANT,borderValue=(255,0,0))#Lanczos4插值 64个 8*8
cv.imshow("dst3", dst3)#边界常数填充
dst4 = cv.warpAffine(cat, M, (w,h),cv.INTER_AREA,borderMode=cv.BORDER_WRAP)#像素区域插值 缩小:均值滤波 放大:整数 双线性 4点,2*2
cv.imshow("dst4", dst4)#边界包裹填充
cv.waitKey(0)
cv.destroyAllWindows()

 3.1 边界复制填充,最近邻插值与原图对比

3.2 边界反射填充,双线性插值与原图对比

3.3 边界反射101填充,双三次插值与原图对比

3.4 边界常数填充,lanczos4插值与原图的对比

3.5 边界包裹填充,像素区域插值与原图对比

4、图像的透视变换矩阵(矫正图片)

————所谓矫正图片就是将一张看着很斜的图片矫正铺直,这里我们使用cv.warpPerspective函数来实现;

 实例操作:

import cv2 as cv
import numpy as np
ox = cv.imread("../images/3.png")
cv.imshow("ox",ox)
shape = ox.shape#获取图片的高宽
picture1 =np.float32([[175,94],[527,137],[110,297],[501,346]])#定义图片的坐标点
picture2 =np.float32([[0,0],[shape[1],0],[0,shape[0]],[shape[1],shape[0]]])#定义图片的坐标点
M = cv.getPerspectiveTransform(picture1,picture2)#获取透视变换矩阵
ox1 = cv.warpPerspective(ox,M,(shape[1],shape[0]),cv.INTER_LINEAR,borderMode=cv.BORDER_CONSTANT)#透视变换
cv.waitKey(0)
cv.destroyAllWindows()

 

5、图像制作掩膜

————掩膜(Mask)是一种在图像处理中常见的操作,它用于选择性地遮挡图像的某些部分,以实现特定任务的目标。掩膜通常是一个二值化图像,并且与原图像的大小相同,其中目标区域被设置为1(或白色),而其他区域被设置为0(或黑色),并且目标区域可以根据HSV的颜色范围进行修改。简言之就是局部变参;API方法用到了,cv.inRange,cv.COLOR_BGR2HSV,

 实例操作:

import cv2 as cv
import numpy as np

demo = cv.imread("../images/demo.png")
demo1=cv.resize(demo, (640, 640))#改变大小
hsv = cv.cvtColor(demo1, cv.COLOR_BGR2HSV)#转换为HSV色度
cv.imshow("demo", demo)
#图像掩膜
lower = np.array([0, 43, 46])#最低颜色范围红色
upper = np.array([10, 255, 255])#最高颜色范围红色
lower1 = np.array([100, 43, 46])#最低颜色范围蓝色
upper1 = np.array([124, 255, 255])#最高颜色范围蓝色
lower2 = np.array([35, 43, 46])#最低颜色范围绿色
upper2 = np.array([77, 255, 255])#最高颜色范围绿色
lower3 = np.array([26, 43, 46])#最低颜色范围黄色
upper3 = np.array([35, 255, 255])#最高颜色范围黄色
mask3 = cv.inRange(hsv,lower3,upper3)#制作黄色掩膜
mask2 = cv.inRange(hsv,lower2,upper2)#制作绿色掩膜
mask1 = cv.inRange(hsv,lower1,upper1)#制作蓝色掩膜
mask = cv.inRange(hsv,lower,upper)#制作红色掩膜
#颜色替换
arr = mask == 255
demo1[arr] = (0, 255, 0)#改变颜色
#颜色提取
dst = cv.bitwise_and(demo1,demo1,mask=mask)#提取红色
dst1 = cv.bitwise_and(demo1,demo1,mask=mask1)#提取蓝色
dst2 = cv.bitwise_and(demo1,demo1,mask=mask2)#提取绿色
dst3 = cv.bitwise_and(demo1,demo1,mask=mask3)#提取黄色
cv.imshow("dst", dst)#显示红色
cv.imshow("dst1", dst1)#显示蓝色
cv.imshow("dst2", dst2)#显示绿色
cv.imshow("dst3", dst3)#显示黄色
cv.imshow("mask", mask)
cv.imshow("mask1", mask1)
cv.imshow("mask2", mask2)
cv.imshow("mask3", mask3)
print(demo.shape)
print(mask.shape)
cv.waitKey(0)
cv.destroyAllWindows()

总结:本期继续学习了许多的API方法,图像预处理的内容有许多,应该还有一期,慢慢掌握API方法,多多巩固知识;


网站公告

今日签到

点亮在社区的每一天
去签到