文章目录
- OpenCV
- 图片修改
- 1. 图片缩放
- 2. 图片打码
- 3. 图片组合
- 图像运算
- 1. 直接相加
- 2. add()方法相加
- 3. 权重相加
- 边界填充
- 阈值调整
- 总结
OpenCV
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库,它主要用于实时图像处理和计算机视觉任务。
本篇所用图片数据:
链接:学习数据
提取码:dzvx
图片修改
1. 图片缩放
# 图片缩放
a = cv2.imread('GGbond.jpg')
a_new_1 = cv2.resize(a,(400,400)) #直接指定宽,高大小
# 或
a_new_2 = cv2.resize(a,dsize=None,fx=0.5,fy=0.5)# 指定x方向和y方向的缩放倍数
print(a.shape) #高 宽
cv2.imshow('a',a)
cv2.imshow('a_new_1',a_new_1)
cv2.imshow('a_new_2',a_new_2)
cv2.waitKey(10000)
cv2.destroyAllWindows()
------------
(1070, 1080, 3)
2. 图片打码
将需要打码的位置,用不同的像素点将其覆盖
import numpy as np
a = cv2.imread('GGbond.jpg')
a = cv2.resize(a,(400,400))
cv2.imshow('a',a)
a[150:350,150:350] = np.random.randint(0,256,(200,200,3)) #替换时,要注意两者范围要一样大
cv2.imshow('masaike',a)
cv2.waitKey(10000)
cv2.destroyAllWindows()
3. 图片组合
也可以理解为,图片替换,即将一张图片中的区域,覆盖在另一张图片上:
# 图片组合
a = cv2.imread("GGbond.jpg")
a = cv2.resize(a,(400,400))
b = cv2.imread("yifei.jpg")
b = cv2.resize(b,(400,400))
a[150:350,150:350] = b[150:350,150:350] #宽 高
cv2.imshow('a',a)
cv2.imshow('b',b)
cv2.waitKey(10000)
cv2.destroyAllWindows()
图像运算
对像素点的值进行加法运算:直接相加、add()方法相加和权重相加
1. 直接相加
- 直接相加的过程,即是将图片中每个像素点的值都加上变量值:如c = a_new + 10,就是将a_new这个图片中的每个像素点值加10。但是,注意!!:当两个像素点之和超过255时,相加后的结果减去256,如a+b=260,像素值结果为260-256=4:
a = cv2.imread('GGbond.jpg')
a_new = cv2.resize(a,dsize=None,fx=0.5,fy=0.5)
c = a_new + 10
cv2.imshow('yuan',a_new)
cv2.imshow('tupian',c)
cv2.waitKey(10000)
- 将对应区域的每个对应的像素点相加:
a = cv2.imread('GGbond.jpg')
b = cv2.imread('yifei.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))
c = a_new[50:300,50:300]+b_new[50:300,50:300]
cv2.imshow("a+b",c)
cv2.waitKey(10000)
2. add()方法相加
注意!!!:add方法的不同,当两个像素点之和超过255时,该位置数值为255,与直接相加不一样:
# add()加法运算
# 注意!!:当两个像素点之和超过255时,该位置数值为255
a = cv2.imread('GGbond.jpg')
b = cv2.imread('yifei.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))
c = cv2.add(a_new,b_new)
cv2.imshow('a+b',c)
cv2.waitKey(10000)
3. 权重相加
就是在计算两个图片的像素值之和时,考虑到每幅图的权重:
#图像加权运算
#就是在计算两个图片的像素值之和时,考虑到每幅图的权重
a = cv2.imread('GGbond.jpg')
b = cv2.imread('tt.jpg')
a_new = cv2.resize(a,(400,400))
b_new = cv2.resize(b,(400,400))
c = cv2.addWeighted(a_new,0.2,b_new,0.8,10) #0.2和0.8:分别表示每幅图所占的权重;10:图像的亮度值
cv2.imshow("addWeeighted",c)
cv2.waitKey(10000)
cv2.destroyAllWindows()
边界填充
将原始图片扩大,使用cv2.copyMakeBorder()函数,用于添加额外边界,参数中使用不同的方法,用不同的形式填充:
copyMakeBorder(src,top,bottom,left,right,borderType)
参数:
-- src:要扩充的原始图像
-- top,bottom,left,right:对应方向上扩充的宽度
-- borderType:定义要添加边框的类型,可以是以下得到一种:
cv2.BORDER_CONSTANT:需要输入BGR值,用BGR值对应的颜色填充
cv2.BORDER_REFLECT:以镜面反射的图像填充,类似fedcba/abcdef/fedcba
cv2.BORDER_REFLECT101:和上面的一样,但是镜像交界处被删除了,类似fedcb/abcdef/edcba
cv2.BORDER_REPLICATE:用最边界的像素值代替,类似aaaa/abcdef/ffff
cv2.BORDER_WRAP:左右两边替换,上下替换
a = cv2.imread('yifei.jpg')
yf = cv2.resize(a,(400,400))
top,bottom,left,right = 50,50,50,50
constant = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_CONSTANT,value=(0,255,0))
reflect = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REFLECT)
reflect101 = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REFLECT101)
replicate = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_REPLICATE)
wrap = cv2.copyMakeBorder(yf,top,bottom,left,right,borderType=cv2.BORDER_WRAP)
cv2.imshow('yuantu',yf)
cv2.waitKey(10000)
cv2.imshow('constant',constant)
cv2.waitKey(10000)
cv2.imshow('reflect',reflect)
cv2.waitKey(10000)
cv2.destroyAllWindows()
cv2.imshow('reflect101',reflect101)
cv2.waitKey(10000)
cv2.imshow('replicate',replicate)
cv2.waitKey(10000)
cv2.imshow('wrap',wrap)
cv2.waitKey(10000)
阈值调整
设置像素点阈值,改变图片颜色通道,适用于将图片二值化,cv2.threshold()方法设定阈值处理图像,给图像设定一个范围,高于设定值的像素值为255,低于设定值的,像素值为0:
cv2.threshold()方法返回两个参数:阈值与调整后图片
a = cv2.imread('yifei.jpg',0)
image = cv2.resize(a,(400,400))
#ret就是实际设定的阈值,此处ret为175
ret,binary = cv2.threshold(image,175,255,cv2.THRESH_BINARY)
ret1,binaryinv = cv2.threshold(image,175,255,cv2.THRESH_BINARY_INV)
ret2,trunc = cv2.threshold(image,175,255,cv2.THRESH_TRUNC)
ret3,tozero = cv2.threshold(image,175,255,cv2.THRESH_TOZERO)
ret4,tozeroinv = cv2.threshold(image,175,255,cv2.THRESH_TOZERO_INV)
cv2.imshow('original',image)
cv2.waitKey(0)
cv2.imshow('binary',binary)
cv2.waitKey(0)
cv2.imshow('binaryinv',binaryinv)
cv2.waitKey(0)
cv2.imshow('trunc',trunc)
cv2.waitKey(0)
cv2.imshow('tozero',tozero)
cv2.waitKey(0)
cv2.imshow('tozeroinv',tozeroinv)
cv2.waitKey(0)
总结
本篇介绍了:
- 图片的修改:缩放、打码、组合。
- 图片的运算:其中值得注意的是。
- 直接相加:当两个像素点之和超过255时,相加后的结果减去256。
- add()方法:当两个像素点之和超过255时,该位置数值为255。
- 权重相加:将图片重合,给重合图片设置权重。
- 边界填充:将原始图片扩大,使用cv2.copyMakeBorder()函数。
- 阈值调整:范围改变图片的像素值,适用于将图片二值化,cv2.threshold()方法设定阈值处理图像,给图像设定一个范围,高于设定值的像素值为255,低于设定值的,像素值为0。