python估计有雾图像透射率图
时间: 2023-10-24 09:07:11 浏览: 126
要估计有雾图像的透射率图,可以使用以下步骤:
1. 计算图像的亮度值:可以使用灰度化或者RGB通道的平均值等方法来计算图像的亮度值。
2. 估计全局大气光:通过选择一定数量的最亮像素,然后计算它们的平均值来估计全局大气光。
3. 估计透射率:使用透射率的估计公式:t(x) = 1 - w * (I(x) / A),其中w是一个权重,I(x)是像素x的亮度值,A是估计的全局大气光。
4. 优化透射率:使用一些优化方法来进一步优化透射率,例如引入先验信息或者使用最小二乘法等。
5. 去除雾:使用透射率和全局大气光来去除图像中的雾。
相关问题
编写程序,实现基于暗通道先验的大气透射率估计图,并采用软抠图法和引导滤波法得到精细化大气透射率图
以下是基于Python语言的程序实现:
```
import cv2
import numpy as np
# 全局大气光照A的估计值
def get_A(img, w=0.95):
# 获取亮度值最大的0.1%像素点
h, w, _ = img.shape
n = int(h * w * 0.001)
bright_pixels = np.argpartition(-cv2.cvtColor(img, cv2.COLOR_BGR2GRAY).ravel(), n)[:n]
A = np.mean(img.reshape((-1, 3))[bright_pixels], axis=0)
return A
# 获取暗通道图像
def get_dark_channel(img, ksize=15):
min_img = cv2.erode(img, np.ones((ksize, ksize)))
return np.min(min_img, axis=2)
# 估计大气透射率t
def get_transmission(img, A, w=0.95, ksize=15):
I_dark = get_dark_channel(img, ksize)
t = 1 - w * A / I_dark
return t
# 软抠图法得到精细化大气透射率图
def soft_matting(I, t, eps=10**-7, win_size=3):
h, w = t.shape
t = cv2.copyMakeBorder(t, win_size, win_size, win_size, win_size, cv2.BORDER_REPLICATE)
I = cv2.copyMakeBorder(I, win_size, win_size, win_size, win_size, cv2.BORDER_REPLICATE)
t_mat = np.zeros((h*w, h*w))
for i in range(win_size, h+win_size):
for j in range(win_size, w+win_size):
cur_win = t[i-win_size:i+win_size+1, j-win_size:j+win_size+1]
cur_win = cur_win.reshape(-1)
cur_win = cur_win - np.mean(cur_win)
cur_win = cur_win / (np.linalg.norm(cur_win) + eps)
cur_I = I[i-win_size:i+win_size+1, j-win_size:j+win_size+1]
cur_I = cur_I.reshape((-1, 3))
cur_I = cur_I - np.mean(cur_I, axis=0)
cur_I = np.dot(cur_I.T, np.diag(cur_win)).dot(cur_I)
t_mat[(i-win_size)*w+j-win_size][(i-win_size)*w+j-win_size] = 1
for ii in range(2*win_size+1):
for jj in range(2*win_size+1):
if ii == win_size and jj == win_size:
continue
t_mat[(i-win_size)*w+j-win-size][(i-win_size+ii)*w+j-win_size+jj] = cur_win[ii*(2*win_size+1)+jj]
t_fine = np.linalg.solve(np.eye(h*w)-10**-4*t_mat, t.reshape(-1)).reshape((h, w))
return t_fine
# 引导滤波法得到精细化大气透射率图
def guided_filter(I, p, r=40, eps=10**-7):
mean_I = cv2.boxFilter(I, -1, (r, r))
mean_p = cv2.boxFilter(p, -1, (r, r))
corr_I = cv2.boxFilter(I*I, -1, (r, r))
corr_Ip = cv2.boxFilter(I*p, -1, (r, r))
var_I = corr_I - mean_I * mean_I
cov_Ip = corr_Ip - mean_I * mean_p
a = cov_Ip / (var_I + eps)
b = mean_p - a * mean_I
mean_a = cv2.boxFilter(a, -1, (r, r))
mean_b = cv2.boxFilter(b, -1, (r, r))
q = mean_a * I + mean_b
return q
# 加载图像
img = cv2.imread("input.jpg")
# 估计全局大气光照A
A = get_A(img)
# 估计大气透射率t
t = get_transmission(img, A)
# 软抠图法得到精细化大气透射率图
t_soft = soft_matting(img, t)
# 引导滤波法得到精细化大气透射率图
t_guide = guided_filter(img.astype(np.float32)/255, t_soft.astype(np.float32))
# 显示结果
cv2.imshow("Original Image", img)
cv2.imshow("Transmission Map", t)
cv2.imshow("Soft Matting Transmission Map", t_soft)
cv2.imshow("Guided Filter Transmission Map", t_guide)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
需要提前安装OpenCV库。程序实现了基于暗通道先验的大气透射率估计图,并采用了软抠图法和引导滤波法得到精细化大气透射率图。其中,软抠图法用于进一步减小估计误差,引导滤波法用于提高精度。
程序执行时,需要将实际图像的路径作为参数传入,程序会显示原图像、估计出的大气透射率图、软抠图法得到的精细化大气透射率图和引导滤波法得到的精细化大气透射率图。
python cv2 彩色图像去雾
彩色图像去雾可以通过以下步骤实现:
1. 将彩色图像转换为灰度图像。
2. 对灰度图像进行暗通道先验估计,得到全局大气光值。
3. 估计图像中的透射率。
4. 根据透射率和大气光值,对原始彩色图像进行去雾处理。
下面是一个简单的 Python 代码示例:
```python
import cv2
import numpy as np
def dark_channel(img, size):
# 计算暗通道图像
b, g, r = cv2.split(img)
min_img = cv2.min(cv2.min(r, g), b)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (size, size))
dc_img = cv2.erode(min_img, kernel)
return dc_img
def estimate_atmosphere(img, dc_img):
# 估计全局大气光值
h, w = img.shape[:2]
flat_img = img.reshape(h * w, 3)
flat_dc = dc_img.reshape(h * w)
indices = np.argsort(flat_dc)[::-1][:h * w // 100]
atmosphere = np.max(flat_img[indices], axis=0)
return atmosphere
def estimate_transmission(img, atmosphere, size, omega):
# 估计透射率
img_norm = img.astype(np.float32) / atmosphere.astype(np.float32)
dc_img_norm = dark_channel(img_norm, size)
transmission = 1 - omega * dc_img_norm
return transmission
def dehaze(img, size=15, omega=0.95):
# 去雾处理
dc_img = dark_channel(img, size)
atmosphere = estimate_atmosphere(img, dc_img)
transmission = estimate_transmission(img, atmosphere, size, omega)
transmission = cv2.max(transmission, 0.1)
result = np.empty_like(img)
for i in range(3):
result[:, :, i] = (img[:, :, i].astype(np.float32) - atmosphere[i]) / transmission + atmosphere[i]
result = np.clip(result, 0, 255).astype(np.uint8)
return result
```
阅读全文
相关推荐
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![docx](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![zip](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)
![-](https://img-home.csdnimg.cn/images/20241231044901.png)
![-](https://img-home.csdnimg.cn/images/20241231045053.png)