圖像增強方法匯總OpenCV+python實現【第一部分:常用圖像增強方法】

圖像增強方法匯總OpenCV+python實現【第一部分】

  • 前言
    • 常用的圖像增強方法
      • 1. 旋轉(Rotation):
      • 2. 平移(Translation):
      • 3. 縮放(Scaling):
      • 4. 剪切變換(Shear Transform):
      • 5. 翻轉(Flipping):
      • 6. 亮度調整(Brightness Adjustment):
      • 7. 對比度調整(Contrast Adjustment):
      • 8. 添加噪聲(Adding Noise):
      • 9. 顏色抖動(Color Jittering):
      • 10. 隨機擦除(Random Erasing)

前言

圖像增強是指通過各種技術手段改善圖像的視覺效果,使其更適合特定的應用場景。以下是一些常見的圖像增強方法。

注意:本文從廣義的角度講圖像增強方法,這些圖像增強方法不一定都適用于CV中AI模型訓練前的圖像處理

常用的圖像增強方法

在CV模型的訓練過程中,圖像增強(Image Augmentation)是一個非常重要的技術,可以有效地增加訓練數據的多樣性,防止過擬合,并提高模型的泛化能力。以下是一些常用的圖像增強方法,它們在訓練CNN模型時非常有用:

1. 旋轉(Rotation):

  • 隨機旋轉圖像一定角度。

# 圖像路徑,替換成你的圖片路徑image_path = '1.jpg'# 載入圖像image = cv2.imread(image_path)# 獲取圖像尺寸(h, w) = image.shape[:2]# 設置旋轉的中心為圖像中心center = (w / 2, h / 2)# 生成一個-90到90之間的隨機旋轉角度angle = np.random.uniform(-90, 90)# 獲取旋轉矩陣,其中1.0表示圖像旋轉后不改變大小rotation_matrix = cv2.getRotationMatrix2D(center, angle, 1.0)# 執行旋轉操作rotated_image = cv2.warpAffine(image, rotation_matrix, (w, h))# 顯示原圖和旋轉后的圖像cv2.imshow('Original Image', image)cv2.imshow('Rotated Image', rotated_image)# 按任意鍵退出cv2.waitKey(0)cv2.destroyAllWindows()

旋轉效果如下:
在這里插入圖片描述


2. 平移(Translation):

  • 隨機平移圖像在水平或垂直方向上的位置。

# 獲取圖像的高和寬
height, width = image.shape[:2]# 隨機生成平移量(注意:這里需要確保平移量不會使圖像超出邊界)
tx = np.random.randint(-100, 100)  # 水平方向上的平移量,單位:像素
ty = np.random.randint(-100, 100)  # 垂直方向上的平移量,單位:像素# 確保平移后的圖像不會超出原始圖像的邊界
tx = max(min(tx, width-1), 0)
ty = max(min(ty, height-1), 0)# 創建仿射變換矩陣
translation_matrix = np.float32([[1, 0, tx], [0, 1, ty]])# 應用仿射變換
translated_image = cv2.warpAffine(image, translation_matrix, (width, height))# 顯示或保存平移后的圖像
cv2.imshow('Original Image', image)
cv2.imshow('Translated Image', translated_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

平移效果如下:
在這里插入圖片描述


3. 縮放(Scaling):

  • 隨機縮放圖像大小。

def random_scale_image(image, scale_range=(0.5, 1.5)):"""
隨機縮放圖像的大小。:param image: 要縮放的圖像,應為numpy數組形式
:param scale_range: 縮放比例的范圍,默認(0.5, 1.5),即縮放后的大小在原始大小的50%到150%之間
:return: 縮放后的圖像
"""# 生成一個隨機的縮放比例scale = np.random.uniform(scale_range[0], scale_range[1])# 獲取原始圖像的高度和寬度height, width = image.shape[:2]# 計算縮放后的新高度和寬度new_height = int(height * scale)new_width = int(width * scale)# 使用cv2.resize()進行縮放scaled_image = cv2.resize(image, (new_width, new_height), interpolation=cv2.INTER_LINEAR)return scaled_image# 隨機縮放圖像
scaled_image = random_scale_image(image)# 顯示縮放后的圖像(如果需要)
cv2.imshow('Original Image', image)
cv2.imshow('Scaled Image', scaled_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

縮放效果:
在這里插入圖片描述


4. 剪切變換(Shear Transform):

  • 隨機剪切圖像。
import random# 步驟1:定義隨機剪切參數# 注意:這里我們假設剪切的區域不能超出原始圖像的范圍shear_height = random.randint(1, height // 2)  # 隨機剪切高度(這里設定為圖像高度的一半以下)shear_width = random.randint(1, width // 2)   # 隨機剪切寬度(這里設定為圖像寬度的一半以下)start_y = random.randint(0, height - shear_height)start_x = random.randint(0, width - shear_width)# 步驟2:剪切圖像sheared_image = image[start_y:start_y+shear_height, start_x:start_x+shear_width]# 步驟3:顯示或保存剪切后的圖像cv2.imshow('Original Image', image)cv2.imshow('Sheared Image', sheared_image)cv2.waitKey(0)cv2.destroyAllWindows()

效果
在這里插入圖片描述


5. 翻轉(Flipping):

  • 隨機水平或垂直翻轉圖像。
# 定義一個函數來隨機翻轉圖像def random_flip(image):# 隨機選擇翻轉模式flip_code = random.choice([0, 1])  # 0為垂直翻轉,1為水平翻轉# 使用cv2.flip函數進行翻轉flipped_image = cv2.flip(image, flip_code)return flipped_image# 調用函數并顯示翻轉后的圖像flipped_image = random_flip(image)cv2.imshow('Original Image', image)cv2.imshow('Flipped Image', flipped_image)cv2.waitKey(0)cv2.destroyAllWindows()

在這里插入圖片描述


6. 亮度調整(Brightness Adjustment):

  • 隨機調整圖像的亮度。
def adjust_brightness_randomly(image, alpha_range=(0.5, 1.5)):# 生成一個隨機亮度調整因子alpha = random.uniform(alpha_range[0], alpha_range[1])# 亮度調整adjusted_image = cv2.convertScaleAbs(image, alpha=alpha, beta=0)return adjusted_image# 隨機調整亮度
adjusted_image = adjust_brightness_randomly(image)# 顯示或保存調整后的圖像
cv2.imshow('Original Image', image)
cv2.imshow('Adjusted Image', adjusted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果
在這里插入圖片描述


7. 對比度調整(Contrast Adjustment):

  • 隨機調整圖像的對比度。
def random_contrast(image, contrast_range=[0.5, 1.5]):# 獲取圖像的維度h, w, _ = image.shape# 隨機選擇對比度系數contrast_factor = np.random.uniform(contrast_range[0], contrast_range[1])# 創建一個空的浮點型圖像來存儲調整后的圖像adjusted_image = np.zeros((h, w, 3), dtype=np.float32)# 對圖像進行對比度調整for i in range(h):for j in range(w):# 將像素值歸一化到0-1之間pixel = image[i, j] / 255.0# 調整對比度adjusted_pixel = np.clip(contrast_factor * (pixel - 0.5) + 0.5, 0, 1)# 將像素值轉換回0-255adjusted_image[i, j] = adjusted_pixel * 255# 將浮點數圖像轉換為無符號整數adjusted_image = np.uint8(adjusted_image)return adjusted_image# 隨機調整圖像的對比度
adjusted_image = random_contrast(image)# 顯示原始圖像和調整后的圖像
cv2.imshow('Original Image', image)
cv2.imshow('Adjusted Image', adjusted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果如下
在這里插入圖片描述


8. 添加噪聲(Adding Noise):

  • 隨機向圖像中添加噪聲。
 # 將圖像數據轉換為浮點型以支持噪聲添加
image_N = image.astype(np.float32)# 定義高斯噪聲的均值和標準差
mean = 0
stddev = 50.0  # 可以根據需要調整這個值來控制噪聲的強度# 生成高斯噪聲
noise = np.random.normal(mean, stddev, image_N.shape)# 將噪聲添加到圖像上
noisy_image = np.clip(image_N + noise, 0, 255).astype(np.uint8)# 顯示或保存帶噪聲的圖像
cv2.imshow('Original Image', image)
cv2.imshow('Noisy Image', noisy_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果
在這里插入圖片描述


9. 顏色抖動(Color Jittering):

  • 隨機改變圖像的顏色屬性,如色調、飽和度和亮度。
 def random_color_shift(image, hue_shift_range=18, sat_shift_range=30, val_shift_range=40):# 將BGR圖像轉換為HSV圖像hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)# 分解HSV圖像的通道h, s, v = cv2.split(hsv)# 隨機改變色調h = cv2.add(h, np.random.randint(-hue_shift_range, hue_shift_range+1))h = np.clip(h, 0, 179)  # 確保色調值在0-179之間# 隨機改變飽和度s = cv2.add(s, np.random.randint(-sat_shift_range, sat_shift_range+1))s = np.clip(s, 0, 255)  # 確保飽和度值在0-255之間# 隨機改變亮度v = cv2.add(v, np.random.randint(-val_shift_range, val_shift_range+1))v = np.clip(v, 0, 255)  # 確保亮度值在0-255之間# 合并HSV通道hsv_shifted = cv2.merge((h, s, v))# 將HSV圖像轉換回BGR圖像image_shifted = cv2.cvtColor(hsv_shifted, cv2.COLOR_HSV2BGR)return image_shifted# 隨機改變顏色屬性
shifted_image = random_color_shift(image)# 顯示或保存圖像
cv2.imshow('Original Image', image)
cv2.imshow('Shifted Image', shifted_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果
在這里插入圖片描述


10. 隨機擦除(Random Erasing)

  • 隨機遮擋圖像的一部分,以增強模型的魯棒性。
def random_mask_image(image, min_mask_area=0.05, max_mask_area=0.2):image_c = image.copy()height, width = image_c.shape[:2]# 確定要遮擋的面積(基于圖像尺寸的百分比)min_mask_width_height = int(min(width, height) * np.sqrt(min_mask_area))max_mask_width_height = int(min(width, height) * np.sqrt(max_mask_area))# 隨機選擇遮擋區域的左上角坐標和大小start_x = random.randint(0, width - max_mask_width_height)start_y = random.randint(0, height - max_mask_width_height)mask_width = random.randint(min_mask_width_height, max_mask_width_height)mask_height = random.randint(min_mask_width_height, max_mask_width_height)# 在圖像上繪制遮擋矩形image_c[start_y:start_y+mask_height, start_x:start_x+mask_width, :] = 0  # 使用黑色(RGB值為0,0,0)進行遮擋return image_c# 使用示例
masked_image = random_mask_image(image)cv2.imshow('Original Image', image)
cv2.imshow('Masked Image', masked_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

效果
在這里插入圖片描述

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/40227.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/40227.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/40227.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

UserWarning: IPython History requires SQLite, your history will not be saved

UserWarning: IPython History requires SQLite, your history will not be saved 很久未打開pycharm,控制臺出現爆紅 解決方法: 重啟pycharm,就好啦!!!我猜測可能是上次pycharm沒有關閉就電腦關機&…

56、Flink DataStream 的管理執行配置詳解

1)概述 1.執行配置 StreamExecutionEnvironment 包含了 ExecutionConfig,它允許在運行時設置作業特定的配置值。 StreamExecutionEnvironment env StreamExecutionEnvironment.getExecutionEnvironment(); ExecutionConfig executionConfig env.get…

《企業實戰分享 · 內存溢出分析》

📢 大家好,我是 【戰神劉玉棟】,有10多年的研發經驗,致力于前后端技術棧的知識沉淀和傳播。 💗 🌻 近期剛轉戰 CSDN,會嚴格把控文章質量,絕不濫竽充數,如需交流&#xff…

用PyQt5打造炫酷界面:深入解析pyqt5-custom-widgets

在PyQt5中,使用自定義小部件可以為應用程序增添更多實用性和時尚感。pyqt5-custom-widgets是一個開源項目,提供了一系列有用且時尚的自定義小部件,如開關按鈕、動畫按鈕等。本文將詳細介紹pyqt5-custom-widgets的安裝和使用方法。 安裝 可以…

權限維持Linux---監控功能Strace后門命令自定義Alias后門

免責聲明:本文僅做技術交流與學習... 目錄 監控功能Strace后門 1、記錄 sshd 明文 監控 篩選查看 2、記錄sshd私鑰 命令自定義Alias后門 1、簡單粗魯實現反彈: 靶機替換命令 攻擊機監聽上線 2.升級(讓命令正常) 將反彈命令進行base64編碼 替換alias命令 …

【Linux】--help,man page , info page

我們知道Linux有很多的命令,那LInux要不要背命令? 答案是背最常用的那些就行了 那有的時候我們想查詢一些命令的詳細用法該怎么辦呢? 這里我給出3種方法 1.--help --help的使用方法很簡單啊 要查詢的命令 --help 我們看個例子 這里我只…

java版企業工程管理系統源碼:全方位的項目管理解決方案

工程管理系統是一款專注于建設工程項目全生命周期管理的軟件。它覆蓋了項目從策劃、設計、施工到竣工的每一個階段,提供全方位的管理功能。系統采用模塊化設計,包括系統管理、系統設置、項目管理、合同管理、預警管理、竣工管理、質量管理、統計報表和工…

李白的酒量之謎

在中國古典文學的璀璨星空中,李白的名字猶如一顆耀眼的星辰,其卓越的文學成就與獨特的人生經歷引得無數后人仰望。特別是“李白斗酒詩百篇”,這句話不僅高度概括了李白的詩歌才華和其對酒精的熱愛,也使得后人對李白的酒量產生了濃…

6月30日功能測試Day10

3.4.4拼團購測試點 功能位置:營銷-----拼團購 后臺優惠促銷列表管理可以添加拼團,查看拼團活動,啟動活動,編輯活動,刪除活動。 可以查看拼團活動中已下單的訂單以狀態 需求分析 功能和添加拼團 商品拼團活動頁 3…

Pytorch中方法對象和屬性,例如size()和shape

文章目錄 方法對象和屬性的基本概念方法對象屬性示例說明總結 常見的方法對象和屬性常見的方法對象常見的屬性總結示例 方法對象和屬性的基本概念 方法對象(method object)和屬性(attribute)是面向對象編程中的兩個重要概念。讓我…

python使用pywebview集成vue3和element-plus開發桌面系統框架

隨著web技術越來越成熟,就連QQ的windows客戶端都用web技術來開發,所以在未來,web技術來開發windows桌面軟件也會越來越多,所以在此發展驅動之下,將最近流程的python與web技術相結合,使用vue3和element-plus…

圖像增強 目標檢測 仿射變換 圖像處理 扭曲圖像

1.背景 在目標檢測中,需要進行圖像增強。這里的代碼模擬了旋轉、扭曲圖像的功能,并且在扭曲的時候,能夠同時把標注的結果也進行扭曲。 這里忽略了讀取xml的過程,假設圖像IMG存在對應的標注框,且坐標為左上、右下兩個…

[C++初階]vector的初步理解

一、標準庫中的vector類 1.vector的介紹 1. vector是表示可變大小數組的序列容器 , 和數組一樣,vector可采用的連續存儲空間來存儲元素。也就是意味著可以采用下標對vector的元素進行訪問,和數組一樣高效。但是又不像數組,它的大…

災后恢復與勒索恢復的區別

災難恢復通常側重于物理基礎設施,如硬盤和網絡設備,而勒索軟件恢復則涉及數據完整性和防范網絡威脅。 BackBox 產品管理副總裁 Amar Ramakrishnan表示,在災難中,企業可能面臨硬件受損等問題,但在網絡安全事件中&#…

Java學習高級一

修飾符 static 類變量的應用場景 成員方法的分類 成員變量的執行原理 成員方法的執行原理 Java之 main 方法 類方法的常見應用場景 代碼塊 設計模式 單例設計模式 餓漢式單例設計模式 懶漢式單例設計模式 繼承 權限修飾符

小紅書 達芬奇:生活問答 AI 機器人

小紅書去年 9 月開始內測的生活問答 AI 機器人:達芬奇,現在可以在小紅書 APP 上用了 得益于小紅書平臺的特性,該助手擅長吃、住、寵、喝、學等等各類生活知識,目前還在搞活動,寫評測筆記最高得 666 元

為什么不能在foreach中刪除元素

文章目錄 快速失敗機制(fail-fast)for-each刪除元素為什么報錯原因分析邏輯分析 如何正確的刪除元素remove 后 breakfor 循環使用 Iterator 總結 快速失敗機制(fail-fast) In systems design, a fail-fast system is one which i…

合肥高新區建設世界領先科技園區政策(商務部分)申報獎勵補貼和條件材料、時間指南

一、合肥高新區建設世界領先科技園區政策(商務部分)申報主體 (更多政策可以查看小編主頁方式) 工商、稅務、統計關系均在合肥高新區,并在高新區持續經營。申請項目在高新區內實施、且符合政策要求的具有獨立法人資格…

網絡基礎:EIGRP

EIGRP(Enhanced Interior Gateway Routing Protocol)是由思科開發的一種高級距離矢量路由協議,結合了距離矢量和鏈路狀態路由協議的優點;EIGRP具有快速收斂、高效帶寬利用、負載均衡等特點,適用于各種規模的網絡。EIGR…

python sklearn機械學習-數據預處理

🌈所屬專欄:【機械學習】?作者主頁: Mr.Zwq??個人簡介:一個正在努力學技術的Python領域創作者,擅長爬蟲,逆向,全棧方向,專注基礎和實戰分享,歡迎咨詢! 您…