opencv 图像雾检测_专栏 | OpenCV图像处理专栏十 | 利用中值滤波进行去雾

原标题:专栏 | OpenCV图像处理专栏十 | 利用中值滤波进行去雾

前言

这是OpenCV图像处理专栏的第十篇文章,介绍一种利用中值滤波来实现去雾的算法。这个方法发表于国内的一篇论文,链接我放附录了。

算法原理

这个算法和之前He Kaiming的暗通道去雾都基于大气散射模型即: 其中 就是输入图像,需要求去雾后的输出图像 ,所以我们只要计算出全局大气光值 和透射率 就可以了。其他的一些介绍和背景交代可以去看原文,这里我直接给出论文的算法核心步骤。

1、定义 ,焦作大气光幕或者雾浓度。

2、计算,即是求暗通道,这一点在 OpenCV图像处理专栏六 | 来自何凯明博士的暗通道去雾算法(CVPR 2009最佳论文) 我已经详细说明了。

3、计算,即对 进行中值滤波得到 。

4、计算,注意式子中取了绝对值。

5、计算,式子中 是控制去雾浓度的系数,取值为 。

6、通过式子获得去雾后的图像,这个式子就是把原始子移项变形得到的。

7、自此,算法结束,得到了利用中值滤波实现的去雾后的结果。

int rows, cols;

//获取最小值矩阵

int **getMinChannel(cv::Mat img) {

rows = img.rows;

cols = img.cols;

if (img.channels != 3) {

fprintf(stderr, "Input Error!");

exit(-1);

}

int **imgGray;

imgGray = new int *[rows];

for (int i = 0; i < rows; i++) {

imgGray[i] = new int[cols];

}

for (int i = 0; i < rows; i++) {

for (int j = 0; j < cols; j++) {

int loacalMin = 255;

for (int k = 0; k < 3; k++) {

if (img.at(i, j)[k] < loacalMin) {

loacalMin = img.at(i, j)[k];

}

}

imgGray[i][j] = loacalMin;

}

}

return imgGray;

}

//求暗通道

int **getDarkChannel(int **img, int blockSize = 3) {

if (blockSize % 2 == 0 || blockSize < 3) {

fprintf(stderr, "blockSize is not odd or too small!");

exit(-1);

}

//计算pool Size

int poolSize = (blockSize - 1) / 2;

int newHeight = rows +

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要使用 OpenCV 处理 DICOM 图像,你需要先将 DICOM 文件读入内存中,然后将其转换为 OpenCV Mat 对象。可以使用 pydicom 库来读取 DICOM 文件,然后使用 OpenCV 的 cv2.imread() 函数将其转换为 Mat 对象。 以下是一个简单的示例代码,演示如何读取 DICOM 文件并将其转换为 OpenCV Mat 对象: ```python import cv2 import pydicom # 读取 DICOM 文件 ds = pydicom.dcmread('path/to/dicom/file.dcm') # 将 DICOM 数据转换为 OpenCV Mat 对象 img = ds.pixel_array.astype('uint16') img = cv2.normalize(img, None, 0, 65535, cv2.NORM_MINMAX) img = cv2.cvtColor(img, cv2.COLOR_GRAY2BGR) ``` 对于将照片转换为素描风格,可以使用 OpenCV 中的 Pencil Sketch 算法。该算法包括两个步骤:首先将图像转换为灰度图像,然后应用高斯模糊和 Sobel 滤波器来生成素描效果。 以下是一个简单的示例代码,演示如何将照片转换为素描风格: ```python import cv2 # 读取图像 img = cv2.imread('path/to/image.jpg') # 将图像转换为灰度图像 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 应用高斯模糊 gray_blur = cv2.GaussianBlur(gray, (21, 21), 0) # 应用 Sobel 滤波器 sobelx = cv2.Sobel(gray_blur, cv2.CV_64F, 1, 0, ksize=5) sobely = cv2.Sobel(gray_blur, cv2.CV_64F, 0, 1, ksize=5) sobel = cv2.addWeighted(sobelx, 1, sobely, 1, 0) # 反转颜色并应用归一化阈值 sketch = 255 - cv2.threshold(sobel, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1] sketch = cv2.normalize(sketch, None, 0, 255, cv2.NORM_MINMAX) # 显示结果 cv2.imshow('Original', img) cv2.imshow('Sketch', sketch) cv2.waitKey(0) cv2.destroyAllWindows() ``` 这将显示原始图像和转换后的素描图像。你可以调整算法的参数来获得不同的效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值