Py-OpenCV学习记录3--图像运算与简单图形操作

目录

图像基本运算

1.加减法

2.图像混合

 3.按位操作(与、或、非、异或)

图像处理方法

图像的颜色空间

几何变换

1.缩放

 2.平移和旋转


图像基本运算

1.加减法

        以加法举例子,加法在图像中有两种形式,一是将两张图片直接相加,而另一种是用OpenCV的add函数相加。两者的区别在于处理颜色的数值溢出的方法。假设有两个像素的颜色值a和b, 运用numpy直接相加的如下流程图所示。

numpy相加方式

        运用add相加的结果如下流程图。

cv2.add相加方式

 

        可以看出add 方法和直接相加的方法区别在于当相加的结果溢出时处理的手段不同,cv.add是在溢出时都取上限255,numpy则再相加后对255取余数。

        注意!相加相减的图像他们的分辨率、通道数必须相等!(其实也就是矩阵的形状要一致)

        另OpenCV中的相减为cv.subtract和矩阵相减与加法相比的运算法则类似,但是是在相减小于0时,subtract为取运算结果为0,矩阵减法为取256减去该负值。

2.图像混合

        以addWeighted()实现,其功能为将两张分辨率和通道数都相等的图片按照权值相融合。

参数->

src1:输入图像1(数组)    alpha:图像1的权值

src2:输入图像2(数组)    beta:图像2的权值

gamma:图像1、2相加后添加的数值(整体加gamma)

计算公式为  

 

import cv2
import numpy as np

im1 = cv2.imread('rainbow.png', flags=cv2.IMREAD_COLOR)#原图1
im2 = cv2.imread('zero.png', flags=cv2.IMREAD_COLOR)#原图2

im_addweight = cv2.addWeighted(im1, 0.5, im2, 0.5, 0)

#显示
cv2.imshow('im1', im1)
cv2.imshow('im2', im2)
cv2.imshow('im_addweight', im_addweight)

k =cv2.waitKey(0)
if k == ord('s'):
    cv2.destroyAllWindows()

注:其中两个图像的权系数可以相加起来小于1

 3.按位操作(与、或、非、异或)

与:bitwise_and()

或:bitwise_or()

非:bitwise_not()    

异或:bitwise_xor()


逻辑运算这个比较简单,不解释了看图吧

import cv2
import numpy as np

im1 = cv2.imread('zero.png', flags=cv2.IMREAD_COLOR)    #原图 圆形
im2 = cv2.imread('rec.png', flags=cv2.IMREAD_COLOR)    #原图 菱形+五角星

im3 = cv2.bitwise_and(im1, im2)    #AND操作
im4 = cv2.bitwise_or(im1, im2)     #OR操作
im5 = cv2.bitwise_not(im1)         #NOT操作
im6 = cv2.bitwise_xor(im1, im2)    #XOR操作

#显示
cv2.imshow('ORI1',im1)
cv2.imshow('ORI2', im2)
cv2.imshow('AND', im3)
cv2.imshow('OR', im4)
cv2.imshow('NOT', im5)
cv2.imshow('XOR', im6)

k = cv2.waitKey(0)
if k == ord('s'):
    cv2.destroyAllWindows()

 

图像处理方法

图像的颜色空间

        不同的颜色空间即表现图像的参数不同,颜色空间的诞生是为了满足历史发展以来不同的需求,不同的颜色空间的表现特性不一样,在实际应用过程中需要根据自身的需要,通过转换颜色空间来选择合适的颜色空间。

        具体对于颜色空间的概念可以参考颜色空间总结_ZhangPY的专栏-CSDN博客,这篇博客中给到了详细的介绍。

RGB的颜色空间
HSL与HSV的颜色空间

 


        最常见的颜色空间有RGB、CMYK、HSV、HSI,其中RGB是一种增色模型,是当前应用最广泛的一种颜色空间,R表示红色、G表示绿色、B表示蓝色,RGB的颜色空间可由一个边长为255的立方体表示。CMYK是一种减色模型,颜色混在一起亮度会降低,常用于印刷行业,四个字母分别为C青(cyan)、M品红(Magenta),Y黄(Yellow)和K黑色(Black)。由于这些在人眼中不太容易分辨出颜色的区别,因此在图像处理中并不常用,多用的是后者HSI与HSV等。HSI、HSL和HSV还有HSB可以说是一回事,颜色模型也非常相近,对比于RGB来说图像处理更加受欢迎,H为色相(Hue)、S为饱和度/色度/彩度(Saturation)以及最后的差异,I为光强(Intensity)、L为亮度(Lightness)、V为明度(Value)以及B也是明度(Brightness)。


对于颜色空间的转换,通过cv2.cvtColor()实现

参数->

src为输入的图像

code便是想要转换的颜色空间,有如下表示:

import cv2 
import numpy as np

im1 = cv2.imread('fruit_test.jpg', flags=cv2.IMREAD_COLOR)#原图
im1_gray = cv2.cvtColor(im1, cv2.COLOR_BGR2GRAY)#gray形式
im1_hsv = cv2.cvtColor(im1, cv2.COLOR_BGR2HSV)#HSV形式
im1_yuv = cv2.cvtColor(im1, cv2.COLOR_BGR2YUV)#YUV形式

#显示
cv2.imshow('im1', im1)
cv2.imshow('im1_gray', im1_gray)
cv2.imshow('im1_hsv', im1_hsv)
cv2.imshow('im1_yuv', im1_yuv)

k =cv2.waitKey(0)
if k == ord('s'):
cv2.destroyAllWindows()

 

几何变换

1.缩放

cv.resize()
实现缩放的功能

 

参数->

src 为操作的图像

dsize 该参数为一个元组(宽x高),表示改变后的图像大小

fx、fy为两个方向上的扩大倍数

        注:(a)dsize和fx=,fy=只能用一个,使用dsize时无需填写fx与fy的数值,在使用fx与fy是dsize需要赋值None.(b)使用dsize时不可以用浮点数,而fx、fy可使用

interpolation 为插值法,常用的有cv2.INTER CUBIC、cv2.LINEAR和cv2.INTER AREA

import cv2 
import numpy as np

im1 = cv2.imread('car_test2.jpg', flags=cv2.IMREAD_COLOR)#原图

im2 = cv2.resize(im1, None, fx=1.2, fy=2, interpolation=cv2.INTER_AREA)#X扩大2倍 y扩大2倍
height, width = im1.shape[:2]
im3 = cv2.resize(im1, (width*1, height*2), interpolation=cv2.INTER_AREA)#x扩大1.2倍 y扩大2倍

#显示
cv2.imshow('im1', im1)
cv2.imshow('im2', im2)
cv2.imshow('im3', im3)

k =cv2.waitKey(0)
if k == ord('s'):
    cv2.destroyAllWindows()

 2.平移和旋转

首先介绍一下原理:图像平移的原理便是将图像中所有的点按照平移量进行移动(水平或垂直),从原始的坐标(x0, y0)移动了(Δx,Δy)到了新坐标点(x1,y1)即完成一次变换。

以矩阵表示如下所示:

图像旋转的原理是将图像所有的点绕着某一个点旋转一个角度θ ,从原始的(x0, y0)(逆时针)旋转了θ ,得到新的坐标点(x1,y1)即完成一次旋转变换。

可表示为

通常的做法为绕着图像中心旋转,此时的旋转矩阵为

 

在OpenCV中需要构建的并非如原理所示的矩阵。

在平移中采用的方法为首先构造一个numpy的变换矩阵 ,将其存为np.float32的numpy数组,作为warpAffine的参数M。

在旋转中采用的是OpenCV中所提供的函数cv2.getRotationMatrix2D来构造旋转矩阵,最后通过warpAffine生成,具体如下代码所示。

import cv2 
import numpy as np

im1 = cv2.imread('test1212.png', flags=cv2.IMREAD_COLOR)#原图
height, width, mode = im1.shape

dsize = (height, width)  #获取生成图片的宽高

#平移
M = np.float32([[1,0,50],[0,1,150]])    #构造平移矩阵
im2 = cv2.warpAffine(im1, M, dsize)     #生成平移结果

#旋转
center = ((height - 1)/2.0, (width - 1)/2.0)  #获取旋转中心
R = cv2.getRotationMatrix2D(center, 90, 1)  #构造旋转矩阵
im3 = cv2.warpAffine(im1, R, dsize)     #生成旋转结果

#显示
cv2.imshow('im1', im1)
cv2.imshow('im2', im2)
cv2.imshow('im3', im3)

k =cv2.waitKey(0)
if k == ord('s'):
    cv2.destroyAllWindows()

 最后分享一个封面啦哈哈哈哈我爱小姐姐

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小聪民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值