021-OpenCV图像几何变换补充

今天才发现前面的图像几何变换只写了改变图像的像素大小,别的没有写,今天给补上。另外发现自己写的平移图片部分没完成,之前想法想的很复杂,所以没写完。今天又重想了一下思路,重点是用了“if 、 elif”语法,算是完成了预想的平移吧。
话不多说,上代码,看结果。

import cv2           # 导入库
import numpy as np
def Trackbar(x):
    pass

'''
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('11.jpg')
 '''
        np.zeros(shape, dtype, order)
    # print(img.shape)  结果为(640, 640, 3)
    # shape(高,宽,色彩通道数)
    # 右键图片,属性里显示的是宽度,高度,正好相反
    # dtype 常用的是np.unit8
    '''
translate = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
'''
cv2.namedWindow(winname,flags)
#  winname是窗口名字
#  flags为窗口显示方式,cv2.WINDOW_NORMAL为正常显示,可以调整大小
# cv2.WINDOW_AUTOSIZE显示原图片的大小,用户不能调整大小
'''
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
cv2.namedWindow('translate', cv2.WINDOW_NORMAL)
'''
    cv2.createTrackbar(trackbarname, windowname, value, count, onChange)
# 创建一个滑动条
# trackbarname 滑动条的名字  windowname 滑动条所在窗口的名字
# value 滑动块所在位置     count 滑动块最大位置,最小默认为0
# onChange 回调函数名
'''
cv2.createTrackbar('row', 'img', 21, 41, Trackbar)
cv2.createTrackbar('column', 'img', 21, 41, Trackbar)

while True:
    '''
        cv2.getTrackbarPos(trackbarname, winname)
    # 作用就是获得当前滑动块的位置
    # trackbarname 滑动条的名字  windowname 滑动条所在窗口的名字
    '''
    row = cv2.getTrackbarPos('row', 'img')  # 行
    column = cv2.getTrackbarPos('column', 'img')  # 列
    if 21 <= row <= 41 and 21 <= column <= 41:
        row = row - 20
        column = column - 20
        for i in range(0, img.shape[0]):    # 外层读行
            for j in range(0, img.shape[1]):    # 内层读列
                if i + row < img.shape[0] and j + column < img.shape[1]:
                    translate[i + row, j + column] = img[i, j]
                    translate[0:row, 0:column] = [0, 0, 0]
                    translate[row:img.shape[0], 0:column] = [0, 0, 0]
                    translate[0:row, column:img.shape[1]] = [0, 0, 0]
    elif row <= 20 and column <= 20:
        row = -(20 - row)
        column = -(20 - column)
        for i in range(0, img.shape[0]):    # 外层读行
            for j in range(0, img.shape[1]):    # 内层读列
                if i + row > 0 and j + column > 0:
                    translate[i + row, j + column] = img[i, j]
                    translate[img.shape[0] + row: img.shape[0], img.shape[1] + column: img.shape[1]] = [0, 0, 0]
                    translate[0:img.shape[0] + row, column + img.shape[1]: img.shape[1]] = [0, 0, 0]
                    translate[img.shape[0] + row: img.shape[0], 0: img.shape[1] + column] = [0, 0, 0]
    '''
       cv2.imshow(winname,mat)
    # winname为显示的窗口
    # mat 需要显示的图像
    '''
    cv2.imshow('img', img)
    cv2.imshow('translate', translate)
    '''
		cv2.imwrite(filename,img,params)
	# filename为保存图片的文件名,img为保存图片的数据
	# params,jpeg格式时是图片质量,1-100,默认95
	# png时是压缩级别,0-9,默认为3,级别越高,图片尺寸越小
	'''
    cv2.imwrite('translate.jpg', translate)
    '''
        cv2.waitKey(delay)
    #  delay为正数时,延时delay毫秒结束
    #  想要用按下某个键时退出可用以下方法:
    #  if cv2.waitKey(1)  & 0xFF == 27:
            break
    #别的方法也行,不唯一
    '''
    if cv2.waitKey(1) & 0xFF == 27:
        break
'''
    cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
    cv2.destroyAllWindows()
#结束所有窗口
'''
cv2.destroyAllWindows()  # 销毁所有窗口

结果如下图。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

可见图片分别向右下角和左上角平移了,同时平移后原图大小不变,图片的内容丢失。
还有一种情况是平移后原图大小改变,图片内容不丢失。代码如下:

import cv2           # 导入库
import numpy as np


def Trackbar(x):
    pass

'''
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('11.jpg')
'''
cv2.namedWindow(winname,flags)
#  winname是窗口名字
#  flags为窗口显示方式,cv2.WINDOW_NORMAL为正常显示,可以调整大小
# cv2.WINDOW_AUTOSIZE显示原图片的大小,用户不能调整大小
'''
cv2.namedWindow('img', cv2.WINDOW_NORMAL)
'''
    cv2.createTrackbar(trackbarname, windowname, value, count, onChange)
# 创建一个滑动条
# trackbarname 滑动条的名字  windowname 滑动条所在窗口的名字
# value 滑动块所在位置     count 滑动块最大位置,最小默认为0
# onChange 回调函数名
'''
cv2.createTrackbar('row', 'img', 21, 41, Trackbar)
cv2.createTrackbar('column', 'img', 21, 41, Trackbar)
while True:
    '''
        cv2.getTrackbarPos(trackbarname, winname)
    # 作用就是获得当前滑动块的位置
    # trackbarname 滑动条的名字  windowname 滑动条所在窗口的名字
    # 得到R、G、B、Line四个滑动条上滑动块的位置,并给circleColor和circle_Line赋值
    # 为了预览一下线的颜色和粗细,画条直线在color_Line_Preview显示一下LookLook
    '''
    row = cv2.getTrackbarPos('row', 'img')  # 行
    column = cv2.getTrackbarPos('column', 'img')  # 列
    '''
        np.zeros(shape, dtype, order)
    # print(img.shape)  结果为(640, 640, 3)
    # shape(高,宽,色彩通道数)
    # 右键图片,属性里显示的是宽度,高度,正好相反
    # dtype 常用的是np.unit8
    '''
    if 21 <= row <= 41 and 21 <= column <= 41:
        row = row - 20
        column = column - 20
        '''
                np.zeros(shape, dtype, order)
            # print(img.shape)  结果为(640, 640, 3)
            # shape(高,宽,色彩通道数)
            # 右键图片,属性里显示的是宽度,高度,正好相反
            # dtype 常用的是np.unit8
        '''
        translate = np.zeros((img.shape[0] + row, img.shape[1] + column, 3), np.uint8)
        for i in range(0, img.shape[0]):    # 外层读行
            for j in range(0, img.shape[1]):    # 内层读列
                    translate[i, j] = img[i, j]
    elif row == column == 20:
        translate = np.zeros((img.shape[0], img.shape[1], 3), np.uint8)
    elif row < 20 and column < 20:
        row = (20 - row)
        column = (20 - column)
        translate = np.zeros((img.shape[0] + row, img.shape[1] + column, 3), np.uint8)
        for i in range(0, img.shape[0]):    # 外层读行
            for j in range(0, img.shape[1]):    # 内层读列
                translate[i + row, j + column] = img[i, j]
    '''
       cv2.imshow(winname,mat)
    # winname为显示的窗口
    # mat 需要显示的图像
    '''
    cv2.imshow('img', img)
    cv2.imshow('translate', translate)
    cv2.imwrite('translate', translate)
    '''
        cv2.waitKey(delay)
    #  delay为正数时,延时delay毫秒结束
    #  想要用按下某个键时退出可用以下方法:
    #  if cv2.waitKey(1)  & 0xFF == 27:
            break
    #别的方法也行,不唯一
    '''
    if cv2.waitKey(1) & 0xFF == 27:
        break
'''
    cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
    cv2.destroyAllWindows()
#结束所有窗口
'''
cv2.destroyAllWindows()  # 销毁所有窗口

结果如下图
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可见平移后原图大小改变,图片内容不丢失。还有一种快速平移的方法:

import cv2
import numpy as np
'''
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('1.jpg')
M1 = np.float32([[1, 0, 10], [0, 1, 20]])
M2 = np.float32([[1, 0, -10], [0, 1, -20]])
'''
    cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None,borderValue=None)
#  src 要变换的图像  M 变换矩阵  dsize 变换后图像的大小
#  dst 变换后输出的图像  flags 插值方式的组合
#  borderMode 边界插值类型    borderValue 边界插值数值
'''
img1 = cv2.warpAffine(img, M1, (img.shape[1], img.shape[0]), dst=None, borderValue=[255, 0, 0])  # 图像大小不变,内容丢失
img2 = cv2.warpAffine(img, M1, (img.shape[1] + 10, img.shape[0] + 20), dst=None, borderValue=[255, 0, 0])  # 图像大小改变,内容不变
img3 = cv2.warpAffine(img, M2, (img.shape[1], img.shape[0]), dst=None, borderValue=[255, 0, 0])  # 图像大小不变,内容丢失
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('1.jpg', img)
cv2.imshow('translate1', img1)
cv2.imshow('translate2', img2)
cv2.imshow('translate3', img3)
'''
    cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if cv2.waitKey(0) & 0xFF == 27:
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
    cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
    cv2.destroyAllWindows()
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图
在这里插入图片描述
在这里插入图片描述
平移这有点啰嗦,,,,接下来是旋转图片。

import cv2
import numpy as np
'''
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('1.jpg')
'''
    cv2.getRotationMatrix2D(center, angle ,scale)
# center 旋转中心  angle 旋转角度 scale 旋转后的缩放因子
'''
M = cv2.getRotationMatrix2D((0.7 * img.shape[1], 0.7 * img.shape[0]), 30, 0.7)
'''
    cv2.warpAffine(src, M, dsize, dst=None, flags=None, borderMode=None,borderValue=None)
#  src 要变换的图像  M 变换矩阵  dsize 变换后图像的大小
#  dst 变换后输出的图像  flags 插值方式的组合
#  borderMode 边界插值类型    borderValue 边界插值数值
'''
img1 = cv2.warpAffine(img, M, (img.shape[1], img.shape[0]))  # 图像大小不变,信息丢失
img2 = cv2.warpAffine(img, M, (img.shape[1]+100, img.shape[0]+100))  # 图像大小改变,信息不丢失
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)
cv2.imshow('img1', img1)
cv2.imshow('img2', img2)
'''
     cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
#         exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
     cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
     cv2.destroyAllWindows()
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图。
在这里插入图片描述
接下来是转置。

import cv2
import numpy as np
'''
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('1.jpg')
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)
'''
    cv2.transpose(src, dst=None)
# 行列互换  src 要互换的图像
'''
img1 = cv2.transpose(img)
cv2.imshow('img1', img1)

'''
    cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
    cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
    cv2.destroyAllWindows()
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图。
在这里插入图片描述
接下来是镜像图像。

import cv2
import numpy as np
'''
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('1.jpg')
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)
'''
    cv2.flip(src, flipCode, dst=None)
    图像翻转
# src 要翻转的图像  dst 输出的图像
# flipCode  =0时, 沿X轴翻转  >0时,沿Y轴翻转 <0时,180度中心对称
'''
img1 = cv2.flip(img, -1)

cv2.imshow('img1', img1)

'''
    cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
    cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
    cv2.destroyAllWindows()
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图。
在这里插入图片描述
接下来是重映射图像。

import cv2           # 导入库
import numpy as np
import math
'''  
    cv2.imread(filename,flags)
# filename为文件名,图片与.py文件在一个文件夹时输入文件名即可
# 不在一个文件夹时输入图片的路径和名字
# flags为图片的颜色类型,默认为1,灰度图像为0
'''
img = cv2.imread('1.jpg')
'''
   cv2.imshow(winname,mat)
# winname为显示的窗口
# mat 需要显示的图像
'''
cv2.imshow('img', img)
'''
   cv2.remap(src, map1, map2, interpolation, dst, borderMode, borderValue)
    重映射
# src 要翻转的图像  dst 输出的图像 map1 (x, y)点的坐标或x坐标,CV_16SC2, CV_32FC1,CV_32FC2类型
# map2 (x, y)点y坐标,如果map1为(x, y),map2可以不用,CV_16UC1, CV_32FC1类型
# interpolation  插值方式,有好几种,默认为cv2.INTER_AREA,线性插值,推荐放大图像时用
# cv2.INTER_AREA 区域插值,推荐缩小图像时使用    别的插值方式碰见了再说
# borderMode 边界插值类型    borderValue 边界插值数值
'''
'''
    np.zeros(shape, dtype, order)
# print(img.shape)  结果为(640, 640, 3)
# shape(高,宽,色彩通道数)
# 右键图片,属性里显示的是宽度,高度,正好相反
# dtype 常用的是np.unit8
'''
xMap = np.zeros(img.shape[:2], np.float32)
yMap = np.zeros(img.shape[:2], np.float32)
for i in range(0, img.shape[0]):
    for j in range(0, img.shape[1]):
        '''
            item(x, y, 0)
        # 对于BGR图像来说,就是查看(x,y)位置的0(也就是B的值是多少)
        # 只能是0、1、2,BGR
            itemset((x, y, 0), 123)
        # 对于BGR图像来说,就是将(x, y)位置的0(也就是B的值是多少)设置成123
        '''
        xMap.itemset((i, j), j)
        yMap.itemset((i, j), i+5 * math.sin(j/10.0))
img1 = cv2.remap(img, xMap, yMap, interpolation=cv2.INTER_LINEAR)
cv2.imshow('img1', img1)
'''
    cv2.waitKey(delay)
#  delay为正数时,延时delay毫秒结束
#  想要用按下某个键时退出可用以下方法:
#  if(cv2.waitKey(0)  == ord('q')):
        exit(0)
#别的方法也行,不唯一
'''
if cv2.waitKey(0) & 0xFF == 27:
    exit(0)
'''
    cv2.destroyWindow(winname)
#结束窗口,winname为窗口名
    cv2.destroyAllWindows()
#结束所有窗口
'''
cv2.destroyAllWindows()

结果如下图。
在这里插入图片描述
就先这样,遇到别的再补充。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值