opencv暗通道去雾
时间: 2023-10-01 13:11:00 浏览: 249
OpenCV暗通道去雾是一种基于暗通道先验原理的去雾方法。该方法认为,一幅有雾图像中的暗通道像素值趋近于0,因此通过求解暗通道可以得到雾的浓度信息,进而去除雾的影响。
具体实现步骤如下:
1. 对输入的有雾图像进行预处理,包括调整亮度、对比度等。
2. 计算暗通道图像。暗通道图像的计算公式为:$J(x)=\min_{y\in\Omega(x)}(\min_{c\in\{r,g,b\}}(I_{c}(y)))$,其中,$J(x)$表示像素点$x$的暗通道值,$\Omega(x)$表示$x$周围的一个窗口,$I_c(y)$表示像素点$y$在通道$c$上的值。
3. 估计全局大气光值。根据暗通道原理,有雾图像中像素值较大的区域通常是天空区域,因此可以选择暗通道像素值最大的一些像素点来估计全局大气光值。
4. 估计透射率。根据大气光值和暗通道图像,可以估计每个像素点的透射率,透射率的计算公式为:$t(x)=1-\omega\min_{c\in\{r,g,b\}}(\frac{I_c(x)}{A_c})$,其中,$\omega$是一个常数,$A_c$是估计得到的大气光值在通道$c$上的分量。
5. 去雾处理。根据透射率和大气光值,可以对输入的有雾图像进行去雾处理,去雾公式为:$J(x)=\frac{I(x)-A}{\max(t(x),t_{0})}+A$,其中,$I(x)$是输入的有雾图像,$t_0$是一个常数,$A$是估计得到的大气光值。
OpenCV暗通道去雾方法简单易懂,且效果较好,可以对有雾图像进行较好的去雾处理。
相关问题
opencv 暗通道去雾
OpenCV暗通道去雾的步骤如下:
1. 读取待去雾的图像I(x)和全球大气光成分A。
2. 计算暗通道图像Jdark(x),其中Jdark(x) = min{min{I(x)}|x∈Ω},Ω为图像块的集合,一般取3*3或者15*15的块。
3. 估计全球大气光成分A,其中A = max{J(x)|x∈Ω},Ω为图像块的集合,一般取3*3或者15*15的块。
4. 估计折射率t,其中t = 1 - w * min{Jdark(x)/A|x∈Ω},w为权重系数,一般取0.95。
5. 对每个颜色通道进行去雾处理,其中J(x) = (I(x) - A) / t + A。
6. 输出去雾后的图像J(x)。
下面是OpenCV暗通道去雾的Python代码示例:
```python
import cv2
import numpy as np
def dark_channel(image, block_size):
# 计算暗通道图像
b, g, r = cv2.split(image)
min_channel = cv2.min(cv2.min(r, g), b)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (block_size, block_size))
dark_channel = cv2.erode(min_channel, kernel)
return dark_channel
def estimate_atmosphere(image, dark_channel):
# 估计全球大气光成分
h, w = image.shape[:2]
flat_image = image.reshape(h * w, 3)
flat_dark = dark_channel.reshape(h * w)
indices = np.argsort(flat_dark)[::-1][:h * w // 100]
atmosphere = np.max(flat_image[indices], axis=0)
return atmosphere
def estimate_transmission(dark_channel, atmosphere, w):
# 估计折射率
transmission = 1 - w * (dark_channel / atmosphere)
return transmission
def dehaze(image, block_size=15, w=0.95):
# OpenCV暗通道去雾
dark = dark_channel(image, block_size)
atmosphere = estimate_atmosphere(image, dark)
transmission = estimate_transmission(dark, atmosphere, w)
transmission = cv2.max(transmission, 0.1)
result = np.empty_like(image)
for i in range(3):
result[:, :, i] = (image[:, :, i] - atmosphere[i]) / transmission + atmosphere[i]
result = cv2.normalize(result, None, 0, 255, cv2.NORM_MINMAX)
return result.astype(np.uint8)
```
暗通道去雾算法 python opencv
暗通道去雾算法是一种常用的图像去雾算法,适用于雾霾天气下的图像处理。下面我们将使用Python的OpenCV库来实现该算法。
首先,我们需要导入OpenCV库并读取原始图像。可以使用`cv2.imread()`函数来读取图像。
```python
import cv2
# 读取原始图像
image = cv2.imread('path_to_image.jpg')
```
然后,我们需要计算图像的暗通道。暗通道是指在一个局部小区域内,图像中最小像素值对应的通道。可以通过以下步骤来计算暗通道:
1. 将图像转换成灰度图像,可以使用`cv2.cvtColor()`函数来实现。
2. 创建一个与原始图像相同大小的空白图像作为输出结果。
3. 对于每个像素位置,计算其对应局部小区域的最小像素值,并将其赋值给输出图像。
```python
# 转换成灰度图像
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 创建空白图像
dark_channel = np.zeros_like(gray)
# 计算暗通道
for i in range(image.shape[0]):
for j in range(image.shape[1]):
neighborhood = gray[max(0, i-15):min(gray.shape[0], i+15), max(0, j-15):min(gray.shape[1], j+15)]
dark_channel[i][j] = np.min(neighborhood)
```
接下来,我们需要计算全局大气光A。全局大气光是指图像中像素值最高的区域,代表了环境中的雾浓度。可以通过以下步骤来计算全局大气光:
1. 根据暗通道图像,选择图像中亮度值较高的像素位置。
2. 在这些像素位置中选择其亮度值最高的像素位置作为全局大气光。
```python
# 选择图像中亮度值较高的像素
brightest_pixels = np.unravel_index(np.argsort(dark_channel.flatten())[-0.001 * dark_channel.size:], dark_channel.shape)
brightest_values = gray[brightest_pixels]
# 在亮度值较高的像素中选择亮度值最高的像素
A = np.max(brightest_values)
```
最后,我们可以根据以下公式来恢复去雾图像:
```python
t = 1 - 0.95 * dark_channel / A
t = np.clip(t, 0.1, 1.0)
result = np.zeros_like(image)
for c in range(3):
result[:, :, c] = (image[:, :, c] - A) / t + A
```
将最终结果保存到文件中:
```python
cv2.imwrite('path_to_result.jpg', result)
```
通过以上步骤,我们可以使用Python的OpenCV库来实现暗通道去雾算法。
阅读全文
相关推荐














