網站首頁 編程語言 正文
創作背景
最近在忙著兩個YOLOv7項目,通過看大量的論文,發現很多的相關的論文都會在收集圖像后進行圖像的增強,本文將使用python中的opencv模塊實現常見的圖像增強方法。
由于光照角度和天氣等不確定因素,導致圖像采集的光環境極其復雜;為了提高目標檢測模型的泛化能力,本文采用了幾種圖像增強方法。
圖像增強方法包括
- 圖像亮度增強和降低
- 水平鏡像
- 垂直鏡像
- 多角度旋轉(90°?,180°?,270°?)
- 高斯噪聲
此外,考慮到圖像采集設備在圖像采集過程中產生的噪聲,以及設備或樹枝晃動造成的拍攝圖像模糊,在圖像中加入方差為0.02的高斯噪聲,進行運動模糊處理。
圖像亮度增強和降低
圖像亮度。指數字圖像中包含色彩的明暗程度,是人眼對物體本身明暗程度的感覺。
圖像亮度調節可以采用最簡單的圖像處理算法,通過常見的線性運算即完成亮度調節,這里我們讓所有的像素點亮度值乘上一個增強系數 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() 函數和warpAffine() 函數實現旋轉原始圖像,通過改變函數參數“angle”分別實現90°?、180°?、270°旋轉。變換后的圖像可以通過正確識別不同方位的目標來提高模型的檢測性能。改變函數參數scal一個各向同性比例因子,根據提供的值向上或向下縮放圖像。
# 旋轉,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函數實現的,通過以圖像的垂直線為中心變換圖像的左側和右側來實現水平鏡像。垂直鏡像是通過以圖像的水平中心線為中心變換圖像的上下側來實現的。
# 水平翻轉
def Horizontal(image):
return cv2.flip(image,1,dst=None)
# 垂直翻轉
def Vertical(image):
return cv2.flip(image,0,dst=None)
高斯噪聲
本文使用NumPy中的可以產生符合高斯分布(正態分布)的隨機數的 np.random.normal()函數。利用產生隨機數的函數來對圖像添加方差為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)) #變換函數
# 椒鹽噪聲
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
適用于項目的的整體代碼
為了滿足項目的使用,我對上述代碼進行了了擴充,實現了對單個圖片,單個文件夾和多個文件夾中多個圖片的圖像的增強
原文鏈接:https://blog.csdn.net/zzqingyun/article/details/127265018
相關推薦
- 2022-06-30 Oracle中的觸發器trigger_oracle
- 2022-05-11 如何在 CSS 中設置組件在瀏覽器屏幕水平垂直居中
- 2022-11-28 Android開發框架MVC-MVP-MVVM-MVI的演變Demo_Android
- 2023-07-28 async await 寫法
- 2022-04-07 Python編程基礎之運算符重載詳解_python
- 2023-03-28 Python使用機器學習模型實現溫度預測詳解_python
- 2022-12-15 詳解Golang如何比較兩個slice是否相等_Golang
- 2022-11-14 Python語言中Tuple的由來分析_python
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支