網站首頁 編程語言 正文
本文實例為大家分享了python實現圖像增強算法的具體代碼,供大家參考,具體內容如下
圖像增強算法,圖像銳化算法
1)基于直方圖均衡化
2)基于拉普拉斯算子
3)基于對數變換
4)基于伽馬變換
5)? CLAHE
6)? retinex-SSR
7)? retinex-MSR
其中,基于拉普拉斯算子的圖像增強為利用空域卷積運算實現濾波
基于同一圖像對比增強效果
直方圖均衡化:對比度較低的圖像適合使用直方圖均衡化方法來增強圖像細節
拉普拉斯算子可以增強局部的圖像對比度
log對數變換對于整體對比度偏低并且灰度值偏低的圖像增強效果較好
伽馬變換對于圖像對比度偏低,并且整體亮度值偏高(對于相機過曝)情況下的圖像增強效果明顯
import cv2
import numpy as np
import matplotlib.pyplot as plt
# 直方圖均衡增強
def hist(image):
? ? r, g, b = cv2.split(image)
? ? r1 = cv2.equalizeHist(r)
? ? g1 = cv2.equalizeHist(g)
? ? b1 = cv2.equalizeHist(b)
? ? image_equal_clo = cv2.merge([r1, g1, b1])
? ? return image_equal_clo
# 拉普拉斯算子
def laplacian(image):
? ? kernel = np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]])
? ? image_lap = cv2.filter2D(image, cv2.CV_8UC3, kernel)
? ?# cv2.imwrite('th1.jpg', image_lap)
? ? return image_lap
# 對數變換
def log(image):
? ? image_log = np.uint8(np.log(np.array(image) + 1))
? ? cv2.normalize(image_log, image_log, 0, 255, cv2.NORM_MINMAX)
? ? # 轉換成8bit圖像顯示
? ? cv2.convertScaleAbs(image_log, image_log)
? ? return image_log
# 伽馬變換
def gamma(image):
? ? fgamma = 2
? ? image_gamma = np.uint8(np.power((np.array(image) / 255.0), fgamma) * 255.0)
? ? cv2.normalize(image_gamma, image_gamma, 0, 255, cv2.NORM_MINMAX)
? ? cv2.convertScaleAbs(image_gamma, image_gamma)
? ? return image_gamma
# 限制對比度自適應直方圖均衡化CLAHE
def clahe(image):
? ? b, g, r = cv2.split(image)
? ? clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
? ? b = clahe.apply(b)
? ? g = clahe.apply(g)
? ? r = clahe.apply(r)
? ? image_clahe = cv2.merge([b, g, r])
? ? return image_clahe
def replaceZeroes(data):
? ? min_nonzero = min(data[np.nonzero(data)])
? ? data[data == 0] = min_nonzero
? ? return data
# retinex SSR
def SSR(src_img, size):
? ? L_blur = cv2.GaussianBlur(src_img, (size, size), 0)
? ? img = replaceZeroes(src_img)
? ? L_blur = replaceZeroes(L_blur)
? ? dst_Img = cv2.log(img/255.0)
? ? dst_Lblur = cv2.log(L_blur/255.0)
? ? dst_IxL = cv2.multiply(dst_Img, dst_Lblur)
? ? log_R = cv2.subtract(dst_Img, dst_IxL)
? ? dst_R = cv2.normalize(log_R,None, 0, 255, cv2.NORM_MINMAX)
? ? log_uint8 = cv2.convertScaleAbs(dst_R)
? ? return log_uint8
def SSR_image(image):
? ? size = 3
? ? b_gray, g_gray, r_gray = cv2.split(image)
? ? b_gray = SSR(b_gray, size)
? ? g_gray = SSR(g_gray, size)
? ? r_gray = SSR(r_gray, size)
? ? result = cv2.merge([b_gray, g_gray, r_gray])
? ? return result
# retinex MMR
def MSR(img, scales):
? ? weight = 1 / 3.0
? ? scales_size = len(scales)
? ? h, w = img.shape[:2]
? ? log_R = np.zeros((h, w), dtype=np.float32)
? ? for i in range(scales_size):
? ? ? ? img = replaceZeroes(img)
? ? ? ? L_blur = cv2.GaussianBlur(img, (scales[i], scales[i]), 0)
? ? ? ? L_blur = replaceZeroes(L_blur)
? ? ? ? dst_Img = cv2.log(img/255.0)
? ? ? ? dst_Lblur = cv2.log(L_blur/255.0)
? ? ? ? dst_Ixl = cv2.multiply(dst_Img, dst_Lblur)
? ? ? ? log_R += weight * cv2.subtract(dst_Img, dst_Ixl)
? ? dst_R = cv2.normalize(log_R,None, 0, 255, cv2.NORM_MINMAX)
? ? log_uint8 = cv2.convertScaleAbs(dst_R)
? ? return log_uint8
def MSR_image(image):
? ? scales = [15, 101, 301] ?# [3,5,9]
? ? b_gray, g_gray, r_gray = cv2.split(image)
? ? b_gray = MSR(b_gray, scales)
? ? g_gray = MSR(g_gray, scales)
? ? r_gray = MSR(r_gray, scales)
? ? result = cv2.merge([b_gray, g_gray, r_gray])
? ? return result
if __name__ == "__main__":
? ? image = cv2.imread('img/FJ(93).png')
? ? image_gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
? ? plt.subplot(4, 2, 1)
? ? plt.imshow(image)
? ? plt.axis('off')
? ? plt.title('Offical')
? ? # 直方圖均衡增強
? ? image_equal_clo = hist(image)
? ? plt.subplot(4, 2, 2)
? ? plt.imshow(image_equal_clo)
? ? plt.axis('off')
? ? plt.title('equal_enhance')
? ? # 拉普拉斯算法增強
? ? image_lap = laplacian(image)
? ? plt.subplot(4, 2, 3)
? ? plt.imshow(image_lap)
? ? plt.axis('off')
? ? plt.title('laplacian_enhance')
? ? # LoG對象算法增強
? ? image_log = log(image)
? ? plt.subplot(4, 2, 4)
? ? plt.imshow(image_log)
? ? plt.axis('off')
? ? plt.title('log_enhance')
? ? # # 伽馬變換
? ? image_gamma = gamma(image)
? ? plt.subplot(4, 2, 5)
? ? plt.imshow(image_gamma)
? ? plt.axis('off')
? ? plt.title('gamma_enhance')
? ? # CLAHE
? ? image_clahe = clahe(image)
? ? plt.subplot(4, 2, 6)
? ? plt.imshow(image_clahe)
? ? plt.axis('off')
? ? plt.title('CLAHE')
? ? # retinex_ssr
? ? image_ssr = SSR_image(image)
? ? plt.subplot(4, 2, 7)
? ? plt.imshow(image_ssr)
? ? plt.axis('off')
? ? plt.title('SSR')
? ? # retinex_msr
? ? image_msr = MSR_image(image)
? ? plt.subplot(4, 2, 8)
? ? plt.imshow(image_msr)
? ? plt.axis('off')
? ? plt.title('MSR')
? ? plt.show()
原文鏈接:https://blog.csdn.net/weixin_43971026/article/details/125444012
相關推薦
- 2022-05-06 Python基于LightGBM進行時間序列預測_python
- 2022-11-06 python使用minimize()?函數替代matlab的fmincon函數_python
- 2022-11-03 如何在C++類的外部調用類的私有方法_C 語言
- 2022-04-30 C#操作DataGridView設置單元格只讀_C#教程
- 2021-11-08 Android如何實現時間線效果_Android
- 2023-02-12 python語音信號處理詳細教程_python
- 2022-08-19 MapReduce讀取定長文件入庫Hive表Orc格式
- 2022-03-05 Linux下Apache服務的部署和配置_Linux
- 最近更新
-
- 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同步修改后的遠程分支