夜景图像自动增强,要求:找到一种夜景图像增强算法,学习算法理论及代码实现,将该算法嵌入GUI界面
时间: 2023-12-01 19:56:49 浏览: 62
夜景图像增强算法可以采用基于Retinex理论的算法,该算法通过对图像的局部区域进行光照模型的估计,来抵消场景中的光照变化,进而实现图像增强。具体来说,该算法可以分为以下几个步骤:
1.图像预处理:将夜景图像进行预处理,包括图像去噪、锐化等操作,以提高后续算法的效果。
2.光照估计:根据Retinex理论,将图像分解为反射分量和衰减分量。反射分量表示场景中物体的反射性质,衰减分量则表示光照衰减的情况。通过对图像的局部区域进行光照模型的估计,可以得到场景中的光照变化情况。
3.图像增强:根据光照估计结果,对图像进行增强处理。可以采用对比度增强、直方图均衡化等方法,改善图像的亮度、对比度等特性。
4.结果后处理:对增强后的图像进行后处理,包括色彩平衡、锐化等操作,以提高图像的视觉效果。
代码实现可以采用Python语言编写,使用OpenCV库进行图像处理。具体实现过程可以参考以下代码:
```python
import cv2
import numpy as np
# 图像预处理
def preprocess(img):
# 去噪
img = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
# 锐化
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
img = cv2.filter2D(img, -1, kernel)
return img
# 光照估计
def retinex(img):
# 将图像转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 取对数
log_I = np.log10(gray + 1)
# 高斯滤波
log_I_blur = cv2.GaussianBlur(log_I, (0, 0), 15)
# 反射分量
R = log_I - log_I_blur
# 衰减分量
A = log_I_blur
# 估计光照
M = np.max(R)
m = np.min(R)
T = (R - m) / (M - m)
T = cv2.GaussianBlur(T, (0, 0), 15)
# 得到光照变化矩阵
L = A + T * (R - A)
# 反向转换
L = np.power(10, L) - 1
L = L.astype(np.uint8)
# 归一化
L = cv2.normalize(L, L, 0, 255, cv2.NORM_MINMAX)
return L
# 图像增强
def enhance(img, L):
# 对比度增强
alpha = 1.5
beta = 0
img = cv2.addWeighted(img, alpha, L, beta, 0)
# 直方图均衡化
img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
channels = cv2.split(img)
channels[0] = cv2.equalizeHist(channels[0])
img = cv2.merge(channels)
img = cv2.cvtColor(img, cv2.COLOR_YCrCb2BGR)
return img
# 后处理
def postprocess(img):
# 色彩平衡
img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
channels = cv2.split(img)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
channels[0] = clahe.apply(channels[0])
img = cv2.merge(channels)
img = cv2.cvtColor(img, cv2.COLOR_LAB2BGR)
# 锐化
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
img = cv2.filter2D(img, -1, kernel)
return img
# 主函数
if __name__ == '__main__':
# 读取图像
img = cv2.imread('night.jpg')
# 图像预处理
img = preprocess(img)
# 光照估计
L = retinex(img)
# 图像增强
img = enhance(img, L)
# 后处理
img = postprocess(img)
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
```
将该算法嵌入GUI界面,可以使用Python的GUI库Tkinter来实现。具体实现过程可以参考以下代码:
```python
import cv2
import numpy as np
import tkinter as tk
from tkinter import filedialog
# 图像预处理
def preprocess(img):
# 去噪
img = cv2.fastNlMeansDenoisingColored(img, None, 10, 10, 7, 21)
# 锐化
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
img = cv2.filter2D(img, -1, kernel)
return img
# 光照估计
def retinex(img):
# 将图像转为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 取对数
log_I = np.log10(gray + 1)
# 高斯滤波
log_I_blur = cv2.GaussianBlur(log_I, (0, 0), 15)
# 反射分量
R = log_I - log_I_blur
# 衰减分量
A = log_I_blur
# 估计光照
M = np.max(R)
m = np.min(R)
T = (R - m) / (M - m)
T = cv2.GaussianBlur(T, (0, 0), 15)
# 得到光照变化矩阵
L = A + T * (R - A)
# 反向转换
L = np.power(10, L) - 1
L = L.astype(np.uint8)
# 归一化
L = cv2.normalize(L, L, 0, 255, cv2.NORM_MINMAX)
return L
# 图像增强
def enhance(img, L):
# 对比度增强
alpha = 1.5
beta = 0
img = cv2.addWeighted(img, alpha, L, beta, 0)
# 直方图均衡化
img = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
channels = cv2.split(img)
channels[0] = cv2.equalizeHist(channels[0])
img = cv2.merge(channels)
img = cv2.cvtColor(img, cv2.COLOR_YCrCb2BGR)
return img
# 后处理
def postprocess(img):
# 色彩平衡
img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)
channels = cv2.split(img)
clahe = cv2.createCLAHE(clipLimit=3.0, tileGridSize=(8,8))
channels[0] = clahe.apply(channels[0])
img = cv2.merge(channels)
img = cv2.cvtColor(img, cv2.COLOR_LAB2BGR)
# 锐化
kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]])
img = cv2.filter2D(img, -1, kernel)
return img
# 打开文件
def open_file():
filepath = filedialog.askopenfilename()
if filepath:
img = cv2.imread(filepath)
# 图像预处理
img = preprocess(img)
# 光照估计
L = retinex(img)
# 图像增强
img = enhance(img, L)
# 后处理
img = postprocess(img)
# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
# 主函数
if __name__ == '__main__':
# 创建GUI界面
root = tk.Tk()
root.title('夜景图像增强')
root.geometry('300x200')
# 创建按钮
btn = tk.Button(root, text='打开文件', command=open_file)
btn.pack(pady=20)
# 运行界面
root.mainloop()
```
运行以上代码后,将会出现一个GUI界面,点击“打开文件”按钮可以选择要增强的夜景图像,程序将自动进行图像增强并显示结果。