今天才发现前面的图像几何变换只写了改变图像的像素大小,别的没有写,今天给补上。另外发现自己写的平移图片部分没完成,之前想法想的很复杂,所以没写完。今天又重想了一下思路,重点是用了“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()
结果如下图。
就先这样,遇到别的再补充。