opencv真货第四节

目录

一、图像的算术运算和位运算

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]]]])
  1. src:要石放的图片
  2. dsize:缩放之后的图片大小,元组和列表表示均可.
  3. dst:可选参数,缩放之后的输出图片
  4. fx, fy: x轴和ly轴的缩放比,即宽度和高度的缩放比.
  5. 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)
  1. flipCode =0表示上下翻转
  2.  flipCode >0表示左右翻转
  3.  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)
  1.  ROTATE_90_CLOCKWISE 90度顺时针
  2.  ROTATE_180 180度
  3.  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)
  1. center中心点,以图片的哪个点作为旋转时的中心点.
  2. angle 角度:旋转的角度,按照逆时针旋转.
  3. 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个点对应三个方程,能解出偏移的参数和旋转的角度.
  1. src原目标的三个点
  2. 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
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值