技术标签: python图像去污
本人qq号:226607573,欢迎互相讨论的伙伴们
毕设期间对python图像去雾的学习与总结
近年来,雾霾越来越严重,导致户外获取的图像严重退化,何如将户外获取的有雾图像复原成高质量的清晰图像,已成为众多研究者的共同目标。
常用的图像去雾方法有以下几种:
1.暗通道去雾
2.色阶调整去雾
3.直方图均衡化
4.Retinex
何凯明博士–暗通道去雾算法
原理:暗通道处理是一个假设, 在绝大多数非天空的局部区域里,某一些像素总会有至少一个颜色通道有很低的值。换言之,该区域光强度的最小值是个很小的数。
**
暗通道可以用下式表达:
暗通道先验的理论指出:
实际生活中造成暗原色中低通道值主要有三个因素:
a)汽车、建筑物和城市中玻璃窗户的阴影,或者是树叶、树与岩石等自然景观的投影;
b)色彩鲜艳的物体或表面,在RGB的三个通道中有些通道的值很低(比如绿色的草地/树/植物,红色或黄色的花朵/叶子,或者蓝色的水面);
c)颜色较暗的物体或者表面,例如灰暗色的树干和石头。总之,自然景物中到处都是阴影或者彩色,
**
I(X)就是我们现在已经有的图像(待去雾的图像)
J(x)是我们要恢复的无雾的图像,A是全球大气光成分, t(x)为透射率
**
找出每个像素的RGB三通道的最小值、形成图像的暗通道图像
展示去雾效果
原图片
在这里插入图片描述
处理后图片
图片增强代码:
图片增强算法一:
def zmMinFilterGray(src, r=7): #如果比最小值小,则替换中心像
#素为最小值,如果中心像素比最大值大,则替换中心像素为最大值。s
'''最小值滤波,r是滤波器半径''' #求最小值滤波图像用来作为引导滤波的引导图像
'''if r <= 0:
return src
h, w = src.shape[:2]
I = src
res = np.minimum(I , I[[0]+range(h-1) , :]) #元素集的最小值计算
res = np.minimum(res, I[range(1,h)+[h-1], :])
I = res
res = np.minimum(I , I[:, [0]+range(w-1)])
res = np.minimum(res, I[:, range(1,w)+[w-1]])
return zmMinFilterGray(res, r-1)'''
return cv2.erode(src, np.ones((2 * r + 1, 2 * r + 1))) # 使用opencv的erode函数更高效
def guidedfilter(I, p, r, eps): #去雾1
#输入图像V1,引导图像p
height, width = I.shape #a,b是以像素k为窗口的周围的权重的均值
m_I = cv2.boxFilter(I, -1, (r, r)) #方框滤波,m_I 窗口W的均值
m_p = cv2.boxFilter(p, -1, (r, r)) #m_p = q受到噪声n污染的退化图像
m_Ip = cv2.boxFilter(I * p, -1, (r, r)) #I * P 的累加
cov_Ip = m_Ip - m_I * m_p #分子
m_II = cv2.boxFilter(I * I, -1, (r, r)) #用于求方差
var_I = m_II - m_I * m_I #窗口W的方差
a = cov_Ip / (var_I + eps) #a,b窗口中心位于 k 时该线性函数的不变系数
b = m_p - a * m_I
m_a = cv2.boxFilter(a, -1, (r, r))
m_b = cv2.boxFilter(b, -1, (r, r))
return m_a * I + m_b
def getV1(m, r, eps, w, maxV1): # 输入rgb图像,值范围[0,1] 去雾1
'''计算大气遮罩图像V1和光照值A, V1 = 1-t/A'''
V1 = np.min(m, 2) # 得到暗通道图像,每个像素RGB分量中的最小值
V1 = guidedfilter(V1, zmMinFilterGray(V1, 7), r, eps) # 使用引导滤波优化
bins = 2000
ht = np.histogram(V1, bins) # 计算大气光照A #写入直方图
d = np.cumsum(ht[0]) / float(V1.size) #元素累加
for lmax in range(bins - 1, 0, -1):
if d[lmax] <= 0.999:
break
A = np.mean(m, 2)[V1 >= ht[1][lmax]].max()
V1 = np.minimum(V1 * w, maxV1) # 对值范围进行限制
return V1, A
def deHaze(m, r=81, eps=0.001, w=0.9, maxV1=0.80, bGamma=False): #去雾1
Y = np.zeros(m.shape) #定义一个零矩阵
V1, A = getV1(m, r, eps, w, maxV1) # 得到遮罩图像和大气光照
for k in range(3):
Y[:, :, k] = (m[:, :, k] - V1) / (1 - V1 / A) # 颜色校正
Y = np.clip(Y, 0, 1)
if bGamma:
Y = Y ** (np.log(0.5) / np.log(Y.mean())) # gamma校正,默认不进行该操作
return Y
还在更新中。**
常用的图像增强方法有以下几种:
1.提高对比度
2.Gamma校正
3.直方图均衡化
均值滤波方法:对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,用模板的均值来替代原像素的值的方法。
中值滤波方法:对待处理的当前像素,选择一个模板,该模板为其邻近的若干个像素组成,对模板的像素由小到大进行排序,再用模板的中值来替代原像素的值的方法。
使用python自带的图像处理库PIL的ImageEnhance模块
1、对比度:白色画面(最亮时)下的亮度除以黑色画面(最暗时)下的亮度
2、色彩饱和度::彩度除以明度,指色彩的鲜艳程度,也称色彩的纯度
3、色调:向负方向调节会显现红色,正方向调节则增加黄色。适合对肤色对象进行微调
4、锐度:是反映图像平面清晰度和图像边缘锐利程度的一个指标
展示增强效果
原图片
处理后图片
图片增强代码:
图片增强算法一:
def m_filter(x, y, step): # 增强
"""中值滤波函数"""
sum_s = [] # 定义空数组
for k in range(-int(step / 2), int(step / 2) + 1):
for m in range(-int(step / 2), int(step / 2) + 1):
sum_s.append(img_zq[x + k][y + m]) # 把模块的像素添加到空数组
sum_s.sort() # 对模板的像素由小到大进行排序
return sum_s[(int(step * step / 2) + 1)]
def Contrast_and_Brightness(alpha, beta, img): # 对比度、亮度增强 增强
"""使用公式f(x)=α.g(x)+β"""
# α调节对比度,β调节亮度
blank = np.zeros(img.shape, img.dtype) # 创建图片类型的零矩阵
dst = cv2.addWeighted(img, alpha, blank, 1 - alpha, beta) # 图像混合加权
return dst
def img_enhance():
# 亮度增强
enh_bri = ImageEnhance.Brightness(image)
brightness = 1.2
image_brightened = enh_bri.enhance(brightness)
# 色度增强
enh_col = ImageEnhance.Color(image_brightened)
color = 1.2
image_colored = enh_col.enhance(color)
# 对比度增强
enh_con = ImageEnhance.Contrast(image_colored)
contrast = 1.2
image_contrasted = enh_con.enhance(contrast)
# 锐度增强
enh_sha = ImageEnhance.Sharpness(image_contrasted)
sharpness = 3.0
image_sharped = enh_sha.enhance(sharpness)
还在更新中
原文链接:https://blog.csdn.net/weixin_41765598/article/details/106036053
文章浏览阅读1k次。通过使用ajax方法跨域请求是浏览器所不允许的,浏览器出于安全考虑是禁止的。警告信息如下:不过jQuery对跨域问题也有解决方案,使用jsonp的方式解决,方法如下:$.ajax({ async:false, url: 'http://www.mysite.com/demo.do', // 跨域URL ty..._nginx不停的xhr
文章浏览阅读2k次。关于在 Oracle 中配置 extproc 以访问 ST_Geometry,也就是我们所说的 使用空间SQL 的方法,官方文档链接如下。http://desktop.arcgis.com/zh-cn/arcmap/latest/manage-data/gdbs-in-oracle/configure-oracle-extproc.htm其实简单总结一下,主要就分为以下几个步骤。..._extproc
文章浏览阅读1.5w次。linux下没有上面的两个函数,需要使用函数 mbstowcs和wcstombsmbstowcs将多字节编码转换为宽字节编码wcstombs将宽字节编码转换为多字节编码这两个函数,转换过程中受到系统编码类型的影响,需要通过设置来设定转换前和转换后的编码类型。通过函数setlocale进行系统编码的设置。linux下输入命名locale -a查看系统支持的编码_linux c++ gbk->utf8
文章浏览阅读750次。今天准备从生产库向测试库进行数据导入,结果在imp导入的时候遇到“ IMP-00009:导出文件异常结束” 错误,google一下,发现可能有如下原因导致imp的数据太大,没有写buffer和commit两个数据库字符集不同从低版本exp的dmp文件,向高版本imp导出的dmp文件出错传输dmp文件时,文件损坏解决办法:imp时指定..._imp-00009导出文件异常结束
文章浏览阅读143次。当下是一个大数据的时代,各个行业都离不开数据的支持。因此,网络爬虫就应运而生。网络爬虫当下最为火热的是Python,Python开发爬虫相对简单,而且功能库相当完善,力压众多开发语言。本次教程我们爬取前程无忧的招聘信息来分析Python程序员需要掌握那些编程技术。首先在谷歌浏览器打开前程无忧的首页,按F12打开浏览器的开发者工具。浏览器开发者工具是用于捕捉网站的请求信息,通过分析请求信息可以了解请..._初级python程序员能力要求
文章浏览阅读7.6k次,点赞2次,收藏6次。@Service标注的bean,类名:ABDemoService查看源码后发现,原来是经过一个特殊处理:当类的名字是以两个或以上的大写字母开头的话,bean的名字会与类名保持一致public class AnnotationBeanNameGenerator implements BeanNameGenerator { private static final String C..._@service beanname
文章浏览阅读6.9w次,点赞73次,收藏463次。1.前序创建#include<stdio.h>#include<string.h>#include<stdlib.h>#include<malloc.h>#include<iostream>#include<stack>#include<queue>using namespace std;typed_二叉树的建立
文章浏览阅读7.1k次。在Asp.net上使用Excel导出功能,如果文件名出现中文,便会以乱码视之。 解决方法: fileName = HttpUtility.UrlEncode(fileName, System.Text.Encoding.UTF8);_asp.net utf8 导出中文字符乱码
文章浏览阅读2.1k次,点赞4次,收藏23次。第一次实验 词法分析实验报告设计思想词法分析的主要任务是根据文法的词汇表以及对应约定的编码进行一定的识别,找出文件中所有的合法的单词,并给出一定的信息作为最后的结果,用于后续语法分析程序的使用;本实验针对 PL/0 语言 的文法、词汇表编写一个词法分析程序,对于每个单词根据词汇表输出: (单词种类, 单词的值) 二元对。词汇表:种别编码单词符号助记符0beginb..._对pl/0作以下修改扩充。增加单词
文章浏览阅读773次。我在使用adb.exe时遇到了麻烦.我想使用与bash相同的adb.exe shell提示符,所以我决定更改默认的bash二进制文件(当然二进制文件是交叉编译的,一切都很完美)更改bash二进制文件遵循以下顺序> adb remount> adb push bash / system / bin /> adb shell> cd / system / bin> chm..._adb shell mv 权限
文章浏览阅读6.8k次,点赞12次,收藏125次。1. 单目相机标定引言相机标定已经研究多年,标定的算法可以分为基于摄影测量的标定和自标定。其中,应用最为广泛的还是张正友标定法。这是一种简单灵活、高鲁棒性、低成本的相机标定算法。仅需要一台相机和一块平面标定板构建相机标定系统,在标定过程中,相机拍摄多个角度下(至少两个角度,推荐10~20个角度)的标定板图像(相机和标定板都可以移动),即可对相机的内外参数进行标定。下面介绍张氏标定法(以下也这么称呼)的原理。原理相机模型和单应矩阵相机标定,就是对相机的内外参数进行计算的过程,从而得到物体到图像的投影_相机-投影仪标定
文章浏览阅读2.2k次。文章目录Wayland 架构Wayland 渲染Wayland的 硬件支持简 述: 翻译一篇关于和 wayland 有关的技术文章, 其英文标题为Wayland Architecture .Wayland 架构若是想要更好的理解 Wayland 架构及其与 X (X11 or X Window System) 结构;一种很好的方法是将事件从输入设备就开始跟踪, 查看期间所有的屏幕上出现的变化。这就是我们现在对 X 的理解。 内核是从一个输入设备中获取一个事件,并通过 evdev 输入_wayland