数据增强:
数据通过某种变换操作,从而生成新数据的过程
采用的部分方式:
缩放、调整亮度与对比度、翻转、旋转、添加噪声、模糊
1.缩放
#导入库import cv2import numpy as nppic = cv2.imread("01.jpg") #读入图片height,width = pic.shape[:2] #获取图片的高和宽#将图像缩小为原来的0.5倍pic_zoom = cv2.resize(pic, (width*0.5,height*0.5), interpolation=cv2.INTER_CUBIC)# cv2.resize(图像变量 ,(宽,高), 插值方法) cv2.imshow('zoom', pic_zoom) #显示图片cv2.waitKey(0) cv2.destroyAllWindows()
cv2.resize(图片变量,(宽,高,颜色通道),插值方法) #颜色通道可略
#注意:先行后列,即先宽后高,与获取图片shape时相反(opencv: cv2.resize 探究(源码))
关于插值方法可参考:/posts/comparison-of-openv-interpolation-algorithms/
2.调整亮度与对比度
(1)方法一 cv2.addWeighted()
#导入库import cv2import numpy as nppic = cv2.imread("01.jpg") #读入图片contrast = 1 #对比度brightness = 100 #亮度pic_turn = cv2.addWeighted(pic,contrast,pic,0,brightness)#cv2.addWeighted(对象,对比度,对象,对比度)'''cv2.addWeighted()实现的是图像透明度的改变与图像的叠加'''cv2.imshow('turn', pic_turn) #显示图片cv2.waitKey(0) cv2.destroyAllWindows()
图像混合( cv2.addWeighted() )
这也是图像添加,但是对图像赋予不同的权重,使得它具有混合感或透明感。图像按以下等式添加:
通过改变[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aar4L0MT-1577624055045)(/3.0-beta/_images/math/69777408db155ee0fca9cc9dee60a269df6d1f96.png)]从右箭头1,您可以执行到另一个图像之间的过渡凉爽。
在这里,我拍了两张图片将它们混合在一起。第一图像的权重为0.7,第二图像的权重为0.3。cv2.addWeighted()在图像上应用以下等式。
[外链图片转存失败(img-n9UMplWg-1564208380704)(/3.0-beta/_images/math/ad472897a50e8e8c0c0bb6dab3f28ef7e6d1813e.png)]
这里被视为零。
img1 = cv2.imread('ml.png')img2 = cv2.imread('opencv_logo.jpg')dst = cv2.addWeighted(img1,0.7,img2,0.3,0)cv2.imshow('dst',dst)cv2.waitKey(0)cv2.destroyAllWindows()
result:
来源:/3.0-beta/doc/py_tutorials/py_core/py_image_arithmetics/py_image_arithmetics.html
推荐文章:Python-OpenCV 图像叠加or图像混合加权(cv2.addWeighted)
opencv: 图片 设置 透明度 并 叠加(cv2.addWeighted)
(2)方法二f(x)= contrast * g(x) + brightness
通过遍历图像的高度,宽度,通道数分别去改变它们对应的值:
def contrast_brightness_control( pic , contrast , brightness):for i in range(pic.shape[0]):for j in range(pic.shape[1]):for k in range(pic.shape[2]):if (pic[i][j][k] * contrast+ brightness<=255):pic[i][j][k] = pic[i][j][k] * contrast+ brightnesselse:pic[i][j][k] = 255return pictemp = contrast_brightness_control(pic, contrast, brightness)#感谢学长的代码
关于pic.shape[0]、 pic.shape[1]、 pic.shape[2]:
pic.shape[0]:图像中像素行的数量或图像阵列的每列中的像素数。
pic.shape[1]:图像中像素列的数量或图像阵列的每行中的像素数。
pic.shape[2]:用于表示每个像素的组件数。
参考:OpenCV Python – Get Image Size – Example
3.翻转
import cv2pic = cv2.imread(“01.jpg”) #读入图片h_pic = cv2.flip(pic, 1)#水平翻转cv2.imshow(“overturn-h”, h_pic)v_pic = cv2.flip(pic, 0)#垂直翻转cv2.imshow(“overturn-v”, v_pic)hv_pic = cv2.flip(pic, -1)#水平垂直翻转cv2.imshow(“overturn-hv”, hv_pic)
cv2.flip(图像变量,翻转方式)
flip(img,1)#1代表水平方向旋转180度flip(img,0)#0代表垂直方向旋转180度flip(img,-1)#-1代表垂直和水平方向同时旋转
参考:OpenCV文档:/2.4/modules/core/doc/operations_on_arrays.html?highlight=flip#cv2.flip
4.旋转
import numpyimport cv2def rotate(image, angle, scale=1.0):height, width = image.shape[:2]#获取图像的高和宽center = (width / 2, height / 2) #取图像的中点M = cv2.getRotationMatrix2D(center, angle, scale)#获得图像绕着某一点的旋转矩阵 rotated = cv2.warpAffine(image, M, (height, width))#cv2.warpAffine()的第二个参数是变换矩阵,第三个参数是输出图像的大小return rotatedpic = cv2.imread(“01.jpg”)angle = 45temp = rotate(pic, angle)
关于变换矩阵:
OpenCV-Python:图像的几何变换(平移、旋转、仿射变换等)
OpenCV文档:/2.4/modules/imgproc/doc/geometric_transformations.html?highlight=cv2.warpaffine#cv2.warpAffine
小贴士:日常进行仿射变换时,在只设置前三个参数的情况下,如
cv2.warpAffine(img,M,(height, width))可以实现基本的仿射变换效果,但可以出现“黑边”现象。而cv2.warpAffine(img,M,(height, width),borderValue=(255,255,255))可将图片边界区域填充为白色。
4.加入噪声
import cv2import numpyimport random #random模块用于生成随机数pic = cv2.imread(“01.jpg”)for i in range(1000):pic[random.randint(0, pic.shape[0]-1)][random.randint(0,pic.shape[1]-1)][:]=255cv2.imshow('pic_noise', pic)
其中random.randint():
import random#random.randint(a, b)#用于生成一个指定范围内的整数。其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= bprint random.randint(12, 20) #生成的随机数n: 12 <= n <= 20 print random.randint(20, 20) #结果永远是20 #print random.randint(20, 10) #该语句是错误的。下限必须小于上限
关于random的更多信息:/yd1227/archive//03/18/1988015.html
5.高斯模糊
import cv2import numpypic = cv2.imread(“01.jpg”)temp = cv2.GaussianBlur(pic, (7,7), 1.5)#cv2.GaussianBlur(图像,卷积核,标准差)cv2.imshow(“pic_blur”, temp)
这个不好懂
关于高斯模糊的原理可见 OpenCV 文档:/3.1.0/d4/d13/tutorial_py_filtering.html