目录
一、图像的算术运算和位运算
1.图像的算术运算
2.图像的融合
3.图像的位运算
二、图像的基本变换
1.图像的放大与缩小
2.图片的翻转
3.图片的旋转
4.仿射变换之图像平移
5.仿射变换之获取变换矩阵
6.透视变换
一、图像的算术运算和位运算 1.图像的算术运算
- opencv使用add来执行图像的加法运算
- opencv使用subtract来执行图像的减法运算
- opencv使用multiply来执行图像的乘法运算
- opencv使用divide来执行图像的加法运算
图片就是矩阵,图片的加法运算就是矩阵的加法运算,这就要求加法运算的两张图shape必须是相同的。(其余的运算同理)
import cv2
import numpy as np
img1=cv2.imread('OIP-C.jpg')
img2=cv2.imread('th.jpg')
#在做加法之前需要把图片的形状变得完全一致才行,两种方式直接该像素,或者切片
#可以通过ndarray的切片方式取出完全一样的形状.
new_img2=img2[0:270,0:406]
print(img1.shape)
print(new_img2.shape)
print('单独的内容 加值----------------------------')
#如果觉得图片不够量,图片还可以和单个数字进行运算
img1+=100 #代表着每个矩阵的值加值
print(img1) #每个和100进行加法运算,超出255的数字,会被截断,相当于% 256
print('----------------------------')
print('单独的内容 减值与减法----------------------------')
#如果觉得图片不够量,图片还可以和单个数字进行运算
img1-=100 #代表着每个矩阵的值加值
# 或者说 new_img3= cv2.subtract(img1,new_img2)
print(img1) #每个和100进行加法运算,超出255的数字,会被截断,相当于% 256
print('----------------------------')
print('单独的内容 乘法----------------------------')
#如果觉得图片不够量,图片还可以和单个数字进行运算
new_img4=cv2.multiply(img1,new_img2)
print(new_img4) #每个和100进行加法运算,超出255的数字,会被截断,相当于% 256
print('----------------------------')
print('单独的内容 除法----------------------------')
#如果觉得图片不够量,图片还可以和单个数字进行运算
new_img4=cv2.divide(img1,new_img2)
print(new_img4) #每个和100进行加法运算,超出255的数字,会被截断,相当于% 256
print('----------------------------')
# cv2.add 加法 *** 作要求两个图片的长宽相同,通道数相同.
# add的规则就是两个图对应位置的元素相加,如果超过255,全部变成255.
imgadd=cv2.add(img1,new_img2)
cv2.imshow('image',imgadd)
cv2.waitKey(0)
cv2.destroyALLWindows()
2.图像的融合
- cv2.addWeighted(src1, alpha, src2, beta, gamma)
import cv2
import numpy as np
img1=cv2.imread('OIP-C.jpg')
img2=cv2.imread('th.jpg')
#可以通过ndarray的切片方式取出完全一样的形状.
new_img2=img2[0:270,0:406]
# 不是简单的加法了.相当于拿图片做了线性运算. new_img = imgl * wl + img2 * w2 + bias.
new_imghe = cv2.addWeighted(img1,0.3,new_img2,0.7,0)
cv2.imshow('image',new_imghe)
cv2.waitKey(0)
cv2.destoryALLWindows()
3.图像的位运算
OpenCV的逻辑运算--与或非,异或。
下面是非 *** 作:‘ | ’
import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
img2=cv2.imread('th.jpg')
#非 *** 作
img1_not =cv2.bitwise_not(img1)
cv2.imshow('not',np.hstack((img1,img1_not)))
print(img1[:2,:2])
print(img1_not[:2,:2]) #255-像素值,这就是非 *** 作
cv2.waitKey(0)
cv2.destoryALLWindows()
下面是与的 *** 作代码:‘ & ’
import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
img2=cv2.imread('th.jpg')
new_img2=img2[0:270,0:406]
#非 *** 作
img1_and =cv2.bitwise_and(img1,new_img2)
cv2.imshow('and',np.hstack((img1,img1_and)))
print(img1[:2,:2])
print("--------------")
print(new_img2[:2,:2])
print("--------------")
print(img1_and[:2,:2]) #255-像素值,这就是非 *** 作
cv2.waitKey(0)
cv2.destoryALLWindows()
对应代码这是输出的数据:
[[[62 40 5]
[62 40 5]]
[[60 38 3]
[60 38 3]]]
--------------
[[[16 6 0]
[16 6 0]]
[[16 6 0]
[16 6 0]]]
--------------
[[[16 0 0]
[16 0 0]]
[[16 6 0]
[16 6 0]]]
就是& *** 作 :
下面是异或的 *** 作:‘ ^ ’
import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
img2=cv2.imread('th.jpg')
new_img2=img2[0:270,0:406]
#异或 *** 作
img1_and =cv2.bitwise_or(img1,new_img2)
cv2.imshow('and',np.hstack((img1,img1_and)))
print(img1[:2,:2])
print("--------------")
print(new_img2[:2,:2])
print("--------------")
print(img1_and[:2,:2]) #255-像素值,这就是非 *** 作
cv2.waitKey(0)
cv2.destoryALLWindows()
异或输出数据与上面同理。
二、图像的基本变换 1.图像的放大与缩小- resize(src, dsize[ dst[, fx[ fy[ interpolation]]]])
- src:要石放的图片
- dsize:缩放之后的图片大小,元组和列表表示均可.
- dst:可选参数,缩放之后的输出图片
- fx, fy: x轴和ly轴的缩放比,即宽度和高度的缩放比.
- interpolation:插值算法,主要有以下几种:
INTER_NEAREST,邻近插值,速度快效果差.
INTER_LINEAR,双线性插值,使用原图中的4个点进行插值.默认.
INTER_CUBIC,三次插值,原图中的16个点.
INTER_AREA,区域插值,效果最好,计算时间最长.
import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
img2=cv2.imread('th.jpg')
print(img1.shape) #图片大小
print(img2.shape)
#对img1进行缩放成img2的大小
new_img1=cv2.resize(img1,(456,307)) #其他数据默认,(x1,x2)改为自己合适的
print(new_img1.shape)
cv2.imshow("image",np.hstack((img2,new_img1)))
cv2.waitKey(0)
cv2.destoryALLWindows()
改变成功:
对于interpolation的参数使用,对比效果:
import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
img2=cv2.imread('th.jpg')
print(img1.shape) #图片大小
print(img2.shape)
#对img1进行缩放成img2的大小
new_img1 = cv2.resize(img1,(640,480),interpolation=cv2.INTER_NEAREST)
new_img2 = cv2.resize (img1,(640,480),interpolation=cv2.INTER_LINEAR)#默认效果
new_img3 = cv2.resize(img1,(640,480),interpolation=cv2.INTER_CUBIC)
new_img4 = cv2.resize(img1,(640,480),interpolation=cv2.INTER_AREA)
cv2.imshow(' new_img1', new_img1)
cv2.imshow(' new_img2', new_img2)
cv2.imshow(' new_img3', new_img3)
cv2.imshow(' new_dog4', new_img4)
cv2.imshow('img1', img1)
cv2.waitKey(0)
cv2.destoryALLWindows()
也可以进行fx,fy的同比缩放:
代码如下:
cv2.imshow('img1', img1)
new_img=cv2.resize(img1,dsize=None,fx=0.5,fy=0.5)
cv2.imshow('new_img1', new_img)
效果如下:
如果说效果失真,可以用interpolation=xxx,几种算法。
2.图片的翻转- flip(src, flipCode)
- flipCode =0表示上下翻转
- flipCode >0表示左右翻转
- flipcode <0上下+左右
import cv2
import numpy as np
img=cv2.imread('OIP-C.jpg')
# flipCode=0,表示上下翻转
# flipCode>0,表示左右翻转
# flipCode <0,表示上下左右翻转
new_img=cv2.flip(img,0)
cv2.imshow('img',np.hstack((img,new_img)))
cv2.waitKey(0)
cv2.destroyALLWindows()
3.图片的旋转
- rotate(img, rotateCode)
- ROTATE_90_CLOCKWISE 90度顺时针
- ROTATE_180 180度
- ROTATE_90_COUNTERCLOCKWISE 90度逆时针
import cv2
import numpy as np
img=cv2.imread('OIP-C.jpg')
#- ROTATE_90_CLOCKWISE 90度顺时针
#-ROTATE_180 180度
#-ROTATE_9o_COUNTERCLOCKWISE 90度逆时针
new_img=cv2.rotate(img,cv2.ROTATE_90_CLOCKWISE)
cv2.imshow('img',img)
cv2.imshow('new_img',new_img)
cv2.waitKey(0)
cv2.destroyALLWindows()
4.仿射变换之图像平移
- warpAffine(src, M, dsize, flags, mode, value)
- M:变换矩阵
- dsize:输出图片大小
- flag: 与resize中的插值算法一致
- mode:边界外推法标志
- value:填充边界值
- 平移矩阵
import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
h,w,ch=img1.shape
#变换矩阵,最少是float32位
M = np.float32([[1,0,200], [0,1,100]]) #200是xt,100是yt
#平移 *** 作
#注意opencv中是先宽度,后高度.
new_img = cv2.warpAffine(img1, M,dsize=(w,h))
cv2.imshow('img',img1)
cv2.imshow('image',new_img)
cv2.waitKey(0)
cv2.destoryALLWindows()
5.仿射变换之获取变换矩阵
仿射变换的难点就是计算变换矩阵, OpenCv提供了计算变换矩阵的API。
- getRotationMatrix2D(center, angle, scalpe)
- center中心点,以图片的哪个点作为旋转时的中心点.
- angle 角度:旋转的角度,按照逆时针旋转.
- scale缩放比例:想把图片进行什么样的缩放.
#在进行旋转 *** 作的时候,不方便手动计算变换矩阵,
# opencv提供了获取变换矩阵的API.
import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
h,w,ch=img1.shape
#逆时针旋转45度
M =cv2.getRotationMatrix2D( (w/2,h/2),45,1)
new_img = cv2.warpAffine (img1,M,(w,h))
cv2.imshow('img',img1)
cv2.imshow('image',new_img)
cv2.waitKey(0)
cv2.destoryALLWindows()
- getAffineTransform(src(], dst[)通过三点可以确定变换后的位置,相当于解方程,3个点对应三个方程,能解出偏移的参数和旋转的角度.
- src原目标的三个点
- dst对应变换后的三个点
import cv2
import numpy as np
#读取图片
img1=cv2.imread('OIP-C.jpg')
h,w,ch=img1.shape
src = np.float32([[200,100],[100,100],[200,300]])
dst = np.float32([[100,150],[360,200],[280,120]])
#需要原始图片的三个点坐标,和变换之后的三个对应的坐标
M=cv2.getAffineTransform(src,dst)
new_img = cv2.warpAffine (img1,M,(w,h))
cv2.imshow('img',img1)
cv2.imshow('image',new_img)
cv2.waitKey(0)
cv2.destoryALLWindows()
6.透视变换
透视变换就是将一种坐标系变换成另一种坐标系.简单来说可以把一张"斜"的图变"正".
请参考:(32条消息) opencv透视变换:GetPerspectiveTransform、warpPerspective函数的使用_jndingxin的博客-CSDN博客_getperspectivetransform
使用的是:
#透视变换
M = cv2.getPerspectiveTransform(src,dst)
#通过透视矩阵把透视变换应用到一个图像上。
cv2.warpPerspective(img,M,(w,h))
参考:
Opencv仿射变换和透明变换的原理与区别 - 知乎 (zhihu.com)
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)