OpenCV-01-图像的几何变换

1. imread后的返回值其实是一个矩阵,这个矩阵shape是(高,宽,维度)
2. 通过imread获得的src矩阵,每个元素值是(B,G,R)而不是常规的(R,G,B)
3. 更改原始图像的数据时候,记住的一个前提是原始图像是一个矩阵。
4. 数据类型(dtype),uint8正好满足0-255的范围
5. 图像的裁剪本质上是对src矩阵操作,选取src矩阵中的部分区域即为裁剪,使用切片就行,src[175:240,180:300](记住这里是先高值,再宽值)
6. python的切片是对原始数据的引用,修改切片后的数据会更改原始数据,并非是拷贝。
7. 图片的镜像:本质上也是对原始图像矩阵做操作,注意最终的行列值关系。(结果是lena上下镜像)。

在这里插入图片描述

height = src.shape[0]
width = src.shape[1]

# 创建一个原图2倍高度的画布
newHight = height*2;
dst = np.zeros((newHight,width,3),np.uint8);

# 将原图的像素值 填到 画布中
for row in range(height):
    for col in range(width):
        # 从原图中获取颜色值
        color = src[row,col];
        # 填充到画布上部分
        dst[row,col] = color

        # 倒序输出
        dst[newHight-row-1,col] = color

    # 每画完一行刷新一次
    cv.waitKey(50)
    cv.imshow("dst", dst);
8. 图像的缩放:可采用 最近领域差值、双线性差值、像素关系重采样、立方插值 OpenCV默认的resize()方法是双线性差值。使用最近领域法对图片进行缩放代码如下(缩小和放大都行!)
# 获取图片信息
height = src.shape[0]
width = src.shape[1]

# 定义缩放系数
scale = 3

# 根据缩放系数创建一个画布
new_height = int(height*scale)
new_width = int(width*scale)

dst = np.zeros((new_height,new_width,3),np.uint8);

# 填充画布的颜色值
for row in range(new_height):
    for col in range(new_width):


        # 当前画布 1*2 --》原图 2*4     3*3 0.5
        # 推算出原来的行和列的位置
        oldRow = int(row/scale)
        oldCol = int(col/scale)

        color = src[oldRow,oldCol]

        # 当前画布 1*2 --》 2*4
        dst[row,col] = color;
9. 图像的平移:借助平移矩阵,代码如下,注意其中的矩阵乘法和齐次矩阵设计
import cv2 as cv
import numpy as np

img = cv.imread("img/lena.jpg", cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 创建一个和原图同样大小的矩阵
dstImg = np.zeros((height,width,3),np.uint8)

for row in range(height):
    for col in range(width):
        # 补成齐次坐标
        sourceMatrix = np.array([col,row,1])

        matrixB = np.array([[1,0,50],
                            [0,1,100]])
        # 矩阵相乘
        dstMatrix = matrixB.dot(sourceMatrix.T)
        # 从原图中获取数据
        dstCol = int(dstMatrix[0])
        dstRow = int(dstMatrix[1])
        # 防止角标越界
        if dstCol < width and dstRow < height:
            dstImg[dstRow,dstCol] = img[row,col]

# 显示图片出来
cv.imshow("dstImg",dstImg)
cv.waitKey(0)
10. 图像的平移:通过调用api方式,主要是warpAffine函数
cv.warpAffine(原始图像,变换矩阵,(输出图像高度,输出图像宽度))
import cv2 as cv
import numpy as np

img = cv.imread("img/lena.jpg",cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 定义位移矩阵
matrixShift = np.float32([
                [1,0,50],
                [0,1,100]
              ])
# 调用api
dstImg = cv.warpAffine(img,matrixShift,(width,height))

cv.imshow("dst",dstImg)
cv.waitKey(0)
11. 图像旋转:借助getRotationMatrix2D()函数
import cv2 as cv

img = cv.imread("img/itheima.jpg", cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 定义仿射矩阵: 参数1:中心点, 参数2:旋转角度,参数3:缩放系数
# 注意这里矩阵中的中心点,先宽后高,具体过程是先绕0,0点旋转,再平移到中心点
matrixAffine = cv.getRotationMatrix2D((width * 0.5, height * 0.5), 45, 0.5)
# 进行仿射变换
dstImg = cv.warpAffine(img, matrixAffine, (width, height))

cv.imshow("dstImg",dstImg)
cv.waitKey(0)
12. 图像的仿射变换,其实就是计算矩阵A到矩阵B的变换矩阵,得到变换矩阵后,再对原始图像应用此矩阵进行变换即可。
import cv2 as cv
import numpy as np

img = cv.imread("img/itheima.jpg", cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 定义图片 左上角,左下角 右上角的坐标
matrixSrc = np.float32([[0,0],[0,height-1],[width-1,0]])
# 将原来的点映射到新的点
matrixDst = np.float32([[50,100],[300,height-200],[width-300,100]])
# 将两个矩阵组合在一起,仿射变换矩阵
matrixAffine = cv.getAffineTransform(matrixSrc,matrixDst)

dstImg = cv.warpAffine(img,matrixAffine,(width,height))

cv.imshow("dstImg", dstImg)

cv.waitKey(0)
13. 图像的上采样和下采样操作,注意其和resize()函数的区别。

我们可以看到,当我们对图片进行下采样操作的时候,即使图片变得非常小,我们任然能够看到它的轮廓,这对后面我们进行机器学习是非常重要的一步操作,而当我们直接使用resize进行操作的时候,我们发现图片似乎不能完全表示它原有的轮廓,出现了很多的小方块!

下采样和resize()函数对比代码如下:

import cv2 as cv;

src_img = cv.imread("img/lena.jpg",cv.IMREAD_COLOR);
imgInfo = src_img.shape
height = imgInfo[0]
width = imgInfo[1]

pry_down1 = cv.pyrDown(src_img)
cv.imshow("down1",pry_down1)
pry_down2 = cv.pyrDown(pry_down1)
cv.imshow("down2",pry_down2)
pry_down3 = cv.pyrDown(pry_down2)
cv.imshow("down3",pry_down3)
pry_down4 = cv.pyrDown(pry_down3)
cv.imshow("down4",pry_down4)

pyr_up1 = cv.pyrUp(pry_down1)
cv.imshow("up1",pyr_up1)
pyr_up2 = cv.pyrUp(pry_down2)
cv.imshow("up2",pyr_up2)
pyr_up3 = cv.pyrUp(pry_down3)
cv.imshow("up3",pyr_up3)
pyr_up4 = cv.pyrUp(pry_down4)
cv.imshow("up4",pyr_up4)


# 对比resize
img2 = cv.resize(src_img,(int(height/2),int(width/2)))
cv.imshow("img1/2",img2)

img4 = cv.resize(src_img,(int(height/4),int(width/4)))
cv.imshow("img1/4",img4)

img8 = cv.resize(src_img,(int(height/8),int(width/8)))
cv.imshow("img1/8",img8)

img16 = cv.resize(src_img,(int(height/16),int(width/16)))
cv.imshow("img1/16",img16)

cv.waitKey(0)
cv.destroyAllWindows()
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Opencv-python图像变换是通过使用不同的变换矩阵来实现的。其中,平移是一种最简单的空间变换。使用Opencv的函数cv2.warpAffine()可以实现平移操作。在代码中,我们需要定义一个变换矩阵M,这个矩阵是一个2行3列的矩阵,决定了平移的方式。其中,M矩阵中的tx和ty分别表示在x和y方向上平移的距离。更具体地说,如果我们向右平移tx个像素,向下平移ty个像素,那么变换矩阵M的定义如下: import numpy as np rows, cols = img.shape[:2] M = np.float32([[1, 0, tx], [0, 1, ty]]) dst = cv2.warpAffine(img, M, (cols, rows)) 在上述代码中,我们使用了NumPy库来创建一个2x3的浮点型变换矩阵M,并将其传递给cv2.warpAffine()函数,该函数会将图像img按照定义的方式进行平移,并生成一个新的图像dst。最后,我们可以通过cv2.imshow()函数显示平移后的图像。 除了平移之外,Opencv还提供了其他的图像变换操作,比如缩放。缩放可以按照指定的宽度和高度来调整图像的大小,也可以按照比例来进行缩放。通过cv2.resize()函数可以实现缩放操作。在代码中,我们可以使用下面的方式来进行缩放操作: import cv2 img = cv2.imread('drawing.jpg') # 按照指定的宽度、高度缩放图片 res = cv2.resize(img, (width, height)) # 按照比例缩放图片 res2 = cv2.resize(img, None, fx=scale_x, fy=scale_y, interpolation=cv2.INTER_LINEAR) 在上面的代码中,我们首先使用cv2.imread()函数读取图像,并将其存储在变量img中。然后,我们可以使用cv2.resize()函数来调整图像的大小。其中,如果我们指定了宽度和高度,那么图像将按照这些指定的大小进行缩放;如果我们指定了fx和fy的比例因子,那么图像将按照这些比例进行缩放。最后,我们可以使用cv2.imshow()函数来显示缩放后的图像。 总结起来,Opencv-python提供了多种图像变换操作,包括平移、缩放等。通过使用相应的函数和变换矩阵,我们可以实现对图像的各种变换操作。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* *3* [opencv-python 详解图像几何变换缩放、平移、旋转、翻转](https://blog.csdn.net/RayChiu757374816/article/details/120036004)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 100%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值