Python?OpenCV實現(xiàn)圖像增強操作詳解
創(chuàng)作背景
最近在忙著兩個YOLOv7項目,通過看大量的論文,發(fā)現(xiàn)很多的相關的論文都會在收集圖像后進行圖像的增強,本文將使用python中的opencv模塊實現(xiàn)常見的圖像增強方法。
由于光照角度和天氣等不確定因素,導致圖像采集的光環(huán)境極其復雜;為了提高目標檢測模型的泛化能力,本文采用了幾種圖像增強方法。
圖像增強方法包括
- 圖像亮度增強和降低
- 水平鏡像
- 垂直鏡像
- 多角度旋轉(90°?,180°?,270°?)
- 高斯噪聲
此外,考慮到圖像采集設備在圖像采集過程中產(chǎn)生的噪聲,以及設備或樹枝晃動造成的拍攝圖像模糊,在圖像中加入方差為0.02的高斯噪聲,進行運動模糊處理。
圖像亮度增強和降低
圖像亮度。指數(shù)字圖像中包含色彩的明暗程度,是人眼對物體本身明暗程度的感覺。
圖像亮度調(diào)節(jié)可以采用最簡單的圖像處理算法,通過常見的線性運算即完成亮度調(diào)節(jié),這里我們讓所有的像素點亮度值乘上一個增強系數(shù) percetage,使得圖像整體變亮或者變暗。
# 變暗 def Darker(image,percetage=0.9): image_copy = image.copy() w = image.shape[1] h = image.shape[0] #get darker for xi in range(0,w): for xj in range(0,h): image_copy[xj,xi,0] = int(image[xj,xi,0]*percetage) image_copy[xj,xi,1] = int(image[xj,xi,1]*percetage) image_copy[xj,xi,2] = int(image[xj,xi,2]*percetage) return image_copy
# 明亮 def Brighter(image, percetage=1.1): image_copy = image.copy() w = image.shape[1] h = image.shape[0] #get brighter for xi in range(0,w): for xj in range(0,h): image_copy[xj,xi,0] = np.clip(int(image[xj,xi,0]*percetage),a_max=255,a_min=0) image_copy[xj,xi,1] = np.clip(int(image[xj,xi,1]*percetage),a_max=255,a_min=0) image_copy[xj,xi,2] = np.clip(int(image[xj,xi,2]*percetage),a_max=255,a_min=0) return image_copy
旋轉
本文使用opencv中的使用getRotationMatrix2D() 函數(shù)和warpAffine() 函數(shù)實現(xiàn)旋轉原始圖像,通過改變函數(shù)參數(shù)“angle”分別實現(xiàn)90°?、180°?、270°旋轉。變換后的圖像可以通過正確識別不同方位的目標來提高模型的檢測性能。改變函數(shù)參數(shù)scal一個各向同性比例因子,根據(jù)提供的值向上或向下縮放圖像。
# 旋轉,R可控制圖片放大縮小 def Rotate(image, angle=15, scale=1): w = image.shape[1] h = image.shape[0] #rotate matrix M = cv2.getRotationMatrix2D((w/2,h/2), angle, scale) #rotate image = cv2.warpAffine(image,M,(w,h)) return image
水平鏡像和垂直鏡像
圖像鏡像(水平和垂直鏡像)是通過opencv中的使用flip函數(shù)實現(xiàn)的,通過以圖像的垂直線為中心變換圖像的左側和右側來實現(xiàn)水平鏡像。垂直鏡像是通過以圖像的水平中心線為中心變換圖像的上下側來實現(xiàn)的。
# 水平翻轉 def Horizontal(image): return cv2.flip(image,1,dst=None) # 垂直翻轉 def Vertical(image): return cv2.flip(image,0,dst=None)
高斯噪聲
本文使用NumPy中的可以產(chǎn)生符合高斯分布(正態(tài)分布)的隨機數(shù)的 np.random.normal()函數(shù)。利用產(chǎn)生隨機數(shù)的函數(shù)來對圖像添加方差為0.02的高斯噪聲。
def gaussian_noise(image, mean=0, var=0.02): # 添加高斯噪聲 # mean : 均值 # var : 方差 image = np.array(image / 255, dtype=float) noise = np.random.normal(mean, var ** 0.5, image.shape) out = image + noise if out.min() < 0: low_clip = -1. else: low_clip = 0. out = np.clip(out, low_clip, 1.0) out = np.uint8(out * 255) return out
其它圖像增強的方法
# 放大縮小 def Scale(image, scale): return cv2.resize(image,None,fx=scale,fy=scale,interpolation=cv2.INTER_LINEAR) # 平移 def Move(img,x,y): img_info=img.shape height=img_info[0] width=img_info[1] mat_translation=np.float32([[2,0,x],[0,2,y]]) #變換矩陣:設置平移變換所需的計算矩陣:2行3列 #[[1,0,20],[0,1,50]] 表示平移變換:其中x表示水平方向上的平移距離,y表示豎直方向上的平移距離。 dst=cv2.warpAffine(img,mat_translation,(width,height)) #變換函數(shù) # 椒鹽噪聲 def SaltAndPepper(src,percetage=0.05): SP_NoiseImg=src.copy() SP_NoiseNum=int(percetage*src.shape[0]*src.shape[1]) for i in range(SP_NoiseNum): randR=np.random.randint(0,src.shape[0]-1) randG=np.random.randint(0,src.shape[1]-1) randB=np.random.randint(0,3) if np.random.randint(0,1)==0: SP_NoiseImg[randR,randG,randB]=0 else: SP_NoiseImg[randR,randG,randB]=255 return SP_NoiseImg #模糊 def Blur(img): blur = cv2.GaussianBlur(img, (7, 7), 1.5) # # cv2.GaussianBlur(圖像,卷積核,標準差) return blur
適用于項目的的整體代碼
為了滿足項目的使用,我對上述代碼進行了了擴充,實現(xiàn)了對單個圖片,單個文件夾和多個文件夾中多個圖片的圖像的增強
到此這篇關于Python OpenCV實現(xiàn)圖像增強操作詳解的文章就介紹到這了,更多相關Python OpenCV圖像增強內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python實現(xiàn)的HTTP并發(fā)測試完整示例
這篇文章主要介紹了Python實現(xiàn)的HTTP并發(fā)測試,涉及Python多線程并發(fā)操作相關實現(xiàn)技巧,需要的朋友可以參考下2015-05-05Python 解析pymysql模塊操作數(shù)據(jù)庫的方法
這篇文章主要介紹了Python 解析pymysql模塊操作數(shù)據(jù)庫的方法,本文給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02PyTorch?device與cuda.device用法介紹
這篇文章主要介紹了PyTorch?device與cuda.device用法,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-04-04