导航:首页 > 编程语言 > python图片直方图均一化

python图片直方图均一化

发布时间:2024-02-03 22:51:10

A. python数据可视化--可视化概述

数据可视化是python最常见的应用领域之一,数据可视化是借助图形化的手段将一组数据以图形的形式表达出来,并利用数据分析和开发工具发现其中未知信息的数据处理过程。

在学术界有一句话广为流传,A picture worths thousand words,就是一图值千言。在课堂上,我经常举的例子就是大家在刷朋友圈的时候如果看到有人转发一篇题目很吸引人的文章时,我们都会点击进去,可能前几段话会很认真地看,文章很长的时候后面就会一目十行,失去阅读的兴趣。

所以将数据、表格和文字等内容用图表的形式表达出来,既能提高读者阅读的兴趣,还能直观表达想要表达的内容。

python可视化库有很多,下面列举几个最常用的介绍一下。

matplotlib

它是python众多数据可视化库的鼻祖,也是最基础的底层数据可视化第三方库,语言风格简单、易懂,特别适合初学者入门学习。

seaborn

Seaborn是在matplotlib的基础上进行了更高级的API封装,从而使得作图更加容易,在大多数情况下使用seaborn能做出很具有吸引力的图,而使用matplotlib就能制作具有更多特色的图。应该把Seaborn视为matplotlib的补充,而不是替代物。

pyecharts

pyecharts是一款将python与echarts结合的强大的数据可视化工具,生成的图表精巧,交互性良好,可轻松集成至 Flask,Sanic,Django 等主流 Web 框架,得到众多开发者的认可。

bokeh

bokeh是一个面向web浏览器的交互式可视化库,它提供了多功能图形的优雅、简洁的构造,并在大型数据集或流式数据集上提供高性能的交互性。

python这些可视化库可以便捷、高效地生成丰富多彩的图表,下面列举一些常见的图表。

柱形图

条形图

坡度图

南丁格尔玫瑰图

雷达图

词云图

散点图

等高线图

瀑布图

相关系数图

散点曲线图

直方图

箱形图

核密度估计图

折线图

面积图

日历图

饼图

圆环图

马赛克图

华夫饼图

还有地理空间型等其它图表,就不一一列举了,下节开始我们先学习matplotlib这个最常用的可视化库。

B. 数据分析员用python做数据分析是怎么回事,需要用到python中的那些内容,具体是怎么操作的

大数据!大数据!其实是离不开数据二字,但是总体来讲,自己之前对数据的认知是不太够的,更多是在关注技术的提升上。换句话讲,自己是在做技术,这些技术处理的是数据,而不能算是自己是在做数据的。大规模数据的处理是一个非常大的课题,但是这一点更偏向于是搞技术的。

与数据分析相关的Python库很多,比如Numpy、pandas、matplotlib、scipy等,数据分析的操作包括数据的导入和导出、数据筛选、数据描述、数据处理、统计分析、可视化等等。接下来我们看一下如何利用Python完成数据的分析。
生成数据表
常见的生成方法有两种,第一种是导入外部数据,第二种是直接写入数据,Python支持从多种类型的数据导入。在开始使用Python进行数据导入前需要先导入pandas库,为了方便起见,我们也同时导入Numpy库。代码是最简模式,里面有很多可选参数设置,例如列名称、索引列、数据格式等等。
检查数据表
Python中使用shape函数来查看数据表的维度,也就是行数和列数。你可以使用info函数查看数据表的整体信息,使用dtypes函数来返回数据格式。Isnull是Python中检验空值的函数,你可以对整个数据表进行检查,也可以单独对某一列进行空值检查,返回的结果是逻辑值,包含空值返回True,不包含则返回False。使用unique函数查看唯一值,使用Values函数用来查看数据表中的数值。
数据表清洗
Python中处理空值的方法比较灵活,可以使用Dropna函数用来删除数据表中包含空值的数据,也可以使用fillna函数对空值进行填充。Python中dtype是查看数据格式的函数,与之对应的是astype函数,用来更改数据格式,Rename是更改列名称的函数,drop_plicates函数删除重复值,replace函数实现数据替换。
数据预处理
数据预处理是对清洗完的数据进行整理以便后期的统计和分析工作,主要包括数据表的合并、排序、数值分列、数据分组及标记等工作。在Python中可以使用merge函数对两个数据表进行合并,合并的方式为inner,此外还有left、right和outer方式。使用ort_values函数和sort_index函数完成排序,使用where函数完成数据分组,使用split函数实现分列。
数据提取
主要是使用三个函数:loc、iloc和ix,其中loc函数按标签值进行提取,iloc按位置进行提取,ix可以同时按标签和位置进行提取。除了按标签和位置提起数据以外,还可以按具体的条件进行数据,比如使用loc和isin两个函数配合使用,按指定条件对数据进行提取。
数据筛选汇总
Python中使用loc函数配合筛选条件来完成筛选功能,配合sum和 count函数还能实现excel中sumif和countif函数的功能。Python中使用的主要函数是groupby和pivot_table。groupby是进行分类汇总的函数,使用方法很简单,制定要分组的列名称就可以,也可以同时制定多个列名称,groupby 按列名称出现的顺序进行分组。

C. 安利3个被程序员夸爆的Python编程小功能


随着数据挖掘分析在企业业务层面的深度应用,我们会发现,在实际业务场景中,数据分析工作已经逐渐分为2个层次;较为流程化但与业务深度结合的数据分析工作,会更倾向于让业务人员通过专业分析工具进行自主 探索 分析,比如我们的Tempo大数据分析平台,就可以通过拖拽式、智能化的简便操作,帮助业务人员快速上手数据分析工作,快速将业务数据价值变现。


而针对一些闭喊更加细致、专业化的建模分析需求,其实还是通过代码的方式去实现更加高效灵活。Tempo大数据分析平台正是考虑到广大专业数据分析人员的实际需求,专门开发了 【扩展编程】 这一功能模块,让自定义编程和平台中已有的节点结合使用,快速提高数据分析工作效率!

为了让广大数据分析师在Tempo平台中,既可以通过编程实现更加灵活的建模,也能避免原生Python编程的一些使用局限,我们还通过广泛的用户调研,在【扩展编程】模块设计了 3个提高Python编程易用性的小功能 ,下面我们一起来看看这三个功能都具体解决了哪些问题~


1、Python洞察不直观 ,分析结果可读性低

我们常说“一图胜千言”,对于数据分析工作来说更是如此。分析结果最终还是要直接赋能实际业务,由于Python代码行的形式让分析结果可读性极低,分析人员无法快速实现对数据的直观 探索 分析,导致整体工作效率的降低。

2、Python调试分析难 ,校验调试流程多,反复折腾易出错

调试和分析是Python开发中非常重要的环节,但代码 校验报错结果难查看 的问题,让很多数据分析人员大伤脑筋。

尤其是现在很多企业数据分析项目是在自己的数据平台中进行的,分析人员只能把平台中的代码复制到第三方平台中进行校验,调试好后再粘贴回平台中运行,非常麻烦。

3、Python运行总“缺包” ,写码大半天,报错一瞬间

在一般的企业数据分析项目中,预先有可能会设置有多套Python环境,版本并不统一。这就会导致分析人员常常卜盯并不清楚自己当前使用的到底是哪一套Python环境,在编码时引用的Python包,在不同的Python环境上运行很有可能会出现缺失,引起代码执行报错,而且这种错误信息并不好排查,一旦报错只能从头再来,让程序员们白白做了无用功。

以往专业数据分析人员遇到以上问题,只能选择用更多的时间和精力去修复bug,那么在我们的Tempo大数据分析平台之中,又是如何解决这些问题,让 Python编程的应用 更简便、更高效、更适应企业实际需求呢?


1、图形化洞察,快速 探索 数据价值

针对传统编码数据分析方式难以直观展示数据分析结果的缺点,Tempo大数据分析平台——扩展编程模块特别支持在代码区域设置 通过matplotlib/seabron等图形方法实现节点洞察 ,校验通过后,就可以直接在洞察区域中查看绘制的图形,比如:折线图、直方图、条形图、饼图等。


以后业务部门简单的可视化分析需求就可以直接在建模挖掘分析的同时快速产出,立等可取,无需再周转其他可视化分析工具,大大提高的数据价值变现的效率。


2、控制台,让调试分析更便捷

针对传统Python编程调试报错信息不好查看的问题, Tempo大数据分析平台—扩展编程模块中的控制台功能,可以 直接在指定区域中显示错误信息和代码中需要print的部分 ,便于使用者快速发现问题,立即调整代码。

除了帮助专业数据分析人员提高工作效率,控制台中的【示例】小模块还内置了常用的参考代码,可以帮助一些不太能熟练应用Python编程语言的小白用户,通过复用或小部分修改逻辑代码的方式,也能快速完成数据逻辑处理工作。用好轿弊野这个功能,团队内部的技能培训也能更有章法了呢!


3、快速查询Python环境和包版本,事前预防,再也不怕“丢包缺包”

Python编程最怕丢包缺包问题,在Tempo大数据分析平台中,我们内置了Python环境版本和包版本的信息查询组件,分析人员在编码之前,可以预先查询一下当前的Python环境版本和包版本,如果发现有缺包就可以在编码工作开始之前补充安装,把“丢包缺包”造成的代码报错风险降到最低。

今天的Tempo小课堂中,小T主要给大家介绍了如何通过Python扩展编程的三个小功能,帮助代码偏好的专业数据分析人员减少不必要的麻烦操作,提高工作效率。


D. 怎么得到python中归一化直方图横坐标的对应值

a=plt.hist()
a[0]就是bins的高度,a[1]就是bins的列表

E. 数字图像处理Python实现图像灰度变换、直方图均衡、均值滤波

import CV2

import

import numpy as np

import random

使用的是pycharm

因为最近看了《银翼杀手2049》,里面Joi实在是太好看了所以原图像就用Joi了

要求是灰度图像,所以第一步先把图像转化成灰度图像

# 读入原始图像

img = CV2.imread('joi.jpg')

# 灰度化处理

gray = CV2.cvtColor(img, CV2.COLOR_BGR2GRAY)

CV2.imwrite('img.png', gray)

第一个任务是利用分段函数增强灰度对比,我自己随便写了个函数大致是这样的

def chng(a):

if a < 255/3:

b = a/2

elif a < 255/3*2:

b = (a-255/3)*2 + 255/6

else:

b = (a-255/3*2)/2 + 255/6 +255/3*2

return b

rows = img.shape[0]

cols = img.shape[1]

cover = .deep(gray)

for i in range(rows):

for j in range(cols):

cover[i][j] = chng(cover[i][j])

CV2.imwrite('cover.png', cover)

下一步是直方图均衡化

# histogram equalization

def hist_equal(img, z_max=255):

H, W = img.shape

# S is the total of pixels

S = H * W * 1.

out = img.()

sum_h = 0.

for i in range(1, 255):

ind = np.where(img == i)

sum_h += len(img[ind])

z_prime = z_max / S * sum_h

out[ind] = z_prime

out = out.astype(np.uint8)

return out

covereq = hist_equal(cover)

CV2.imwrite('covereq.png', covereq)

在实现滤波之前先添加高斯噪声和椒盐噪声(代码来源于网络)

不知道这个椒盐噪声的名字是谁起的感觉隔壁小孩都馋哭了

用到了random.gauss()

percentage是噪声占比

def GaussianNoise(src,means,sigma,percetage):

NoiseImg=src

NoiseNum=int(percetage*src.shape[0]*src.shape[1])

for i in range(NoiseNum):

randX=random.randint(0,src.shape[0]-1)

randY=random.randint(0,src.shape[1]-1)

NoiseImg[randX, randY]=NoiseImg[randX,randY]+random.gauss(means,sigma)

if NoiseImg[randX, randY]< 0:

NoiseImg[randX, randY]=0

elif NoiseImg[randX, randY]>255:

NoiseImg[randX, randY]=255

return NoiseImg

def PepperandSalt(src,percetage):

NoiseImg=src

NoiseNum=int(percetage*src.shape[0]*src.shape[1])

for i in range(NoiseNum):

randX=random.randint(0,src.shape[0]-1)

randY=random.randint(0,src.shape[1]-1)

if random.randint(0,1)<=0.5:

NoiseImg[randX,randY]=0

else:

NoiseImg[randX,randY]=255

return NoiseImg

covereqg = GaussianNoise(covereq, 2, 4, 0.8)

CV2.imwrite('covereqg.png', covereqg)

covereqps = PepperandSalt(covereq, 0.05)

CV2.imwrite('covereqps.png', covereqps)

下面开始均值滤波和中值滤波了

就以n x n为例,均值滤波就是用这n x n个像素点灰度值的平均值代替中心点,而中值就是中位数代替中心点,边界点周围补0;前两个函数的作用是算出这个点的灰度值,后两个是对整张图片进行

#均值滤波模板

def mean_filter(x, y, step, img):

sum_s = 0

for k in range(x-int(step/2), x+int(step/2)+1):

for m in range(y-int(step/2), y+int(step/2)+1):

if k-int(step/2) 0 or k+int(step/2)+1 > img.shape[0]

or m-int(step/2) 0 or m+int(step/2)+1 > img.shape[1]:

sum_s += 0

else:

sum_s += img[k][m] / (step*step)

return sum_s

#中值滤波模板

def median_filter(x, y, step, img):

sum_s=[]

for k in range(x-int(step/2), x+int(step/2)+1):

for m in range(y-int(step/2), y+int(step/2)+1):

if k-int(step/2) 0 or k+int(step/2)+1 > img.shape[0]

or m-int(step/2) 0 or m+int(step/2)+1 > img.shape[1]:

sum_s.append(0)

else:

sum_s.append(img[k][m])

sum_s.sort()

return sum_s[(int(step*step/2)+1)]

def median_filter_go(img, n):

img1 = .deep(img)

for i in range(img.shape[0]):

for j in range(img.shape[1]):

img1[i][j] = median_filter(i, j, n, img)

return img1

def mean_filter_go(img, n):

img1 = .deep(img)

for i in range(img.shape[0]):

for j in range(img.shape[1]):

img1[i][j] = mean_filter(i, j, n, img)

return img1

完整main代码如下:

if __name__ == "__main__":

# 读入原始图像

img = CV2.imread('joi.jpg')

# 灰度化处理

gray = CV2.cvtColor(img, CV2.COLOR_BGR2GRAY)

CV2.imwrite('img.png', gray)

rows = img.shape[0]

cols = img.shape[1]

cover = .deep(gray)

for i in range(rows):

for j in range(cols):

cover[i][j] = chng(cover[i][j])

CV2.imwrite('cover.png', cover)

covereq = hist_equal(cover)

CV2.imwrite('covereq.png', covereq)

covereqg = GaussianNoise(covereq, 2, 4, 0.8)

CV2.imwrite('covereqg.png', covereqg)

covereqps = PepperandSalt(covereq, 0.05)

CV2.imwrite('covereqps.png', covereqps)

meanimg3 = mean_filter_go(covereqps, 3)

CV2.imwrite('medimg3.png', meanimg3)

meanimg5 = mean_filter_go(covereqps, 5)

CV2.imwrite('meanimg5.png', meanimg5)

meanimg7 = mean_filter_go(covereqps, 7)

CV2.imwrite('meanimg7.png', meanimg7)

medimg3 = median_filter_go(covereqg, 3)

CV2.imwrite('medimg3.png', medimg3)

medimg5 = median_filter_go(covereqg, 5)

CV2.imwrite('medimg5.png', medimg5)

medimg7 = median_filter_go(covereqg, 7)

CV2.imwrite('medimg7.png', medimg7)

medimg4 = median_filter_go(covereqps, 7)

CV2.imwrite('medimg4.png', medimg4)

F. 直方图均衡化

想象一下,如果一副图像中的大多是像素点的像素值都集中在一个像素值范围之内会怎样呢?例如,如果一幅图片整体很亮,那所有的像素值应该都会很高。但是一副高质量的图像的像素值分布应该很广泛。所以你应该把它的直方图做一个横向拉伸(如下图),这就是直方图均衡化要做的事情。通常情况下,这种操作会改善图像的对比度。

这种方法通常用来增加许多图像的全局 对比度 ,尤其是当图像的有用数据的对比度相当接近的时候。通过这种方法, 亮度 可以更好地在直方图上分布。这样就可以用于增强局部的对比度而不影响整体的对比度,直方图均衡化通过有效地扩展常用的亮度来实现这种功能。

这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来 X光 图像中更好的 骨骼 结构显示以及曝光过度或者曝光不足 照片 中更好的细节。这种方法的一个主要优势是它是一个相当直观的技术并且是 可逆 操作,如果已知均衡化 函数 ,那么就可以恢复原始的直方图,并且计算量也不大。这种方法的一个缺点是它对处理的数据不加选择,它可能会增加背景 噪声 的对比度并且降低有用 信号 的对比度。

我们先来看看相应的直方图和累积直方图,然后使用 OpenCV 进行直方图均衡化。

我们可以看出来直方图大部分在灰度值较高的部分,而且分布很集中。而我们希望直方图的分布比较分散,能够涵盖整个 x 轴。所以,我们就需要一个变换函数帮助我们把现在的直方图映射到一个广泛分布的直方图中,这就是直方图均衡化。

**限制对比度自适应性直方图均衡化 CLAHE **

在上边做的直方图均衡化会改变整个图像的对比度,但是在很多情况下,这样做的效果并不好。的确在进行完直方图均衡化之后,图片背景的对比度被改变了。但是你再对比一下两幅图像中雕像的面图,由于太亮我们丢失了很多信息。

原理:

为了解决这个问题,我们需要使用自适应的直方图均衡化 CLAHE (Contrast Limited Adaptive Histogram Equalization)。这种情况下,整幅图像会被分成很多小块,这些小块被称为“tiles”(在 OpenCV 中 tileGridSize默认是 8x8),然后再对每一个小块分别进行直方图均衡化(跟前面类似)。所以在每一个的区域中,直方图会集中在某一个小的区域中(除非有噪声干扰)。如果有噪声的话,噪声会被放大。为了避免这种情况的出现,要使用对比度限制。

CLAHE中,每一个像素邻域都要进行对比度限制,从而得到对应的变换函数,被用来降低AHE中噪声的增强,这主要是通过限制AHE中的对比度增强来实现的。像素周围邻域噪声的增强主要是由变换函数的斜率造成的,由于像素邻域的噪声与邻域的CDF成正比,因此也与邻域直方图在该中心像素位置的值成正比,CLAHE之所举仿以能够限制对比度,是因为它在计算邻域的CDF之前在指定阈值处对直方正辩纤图进行了修剪,如下图所示,这一做法不仅限制了CDF的斜率,也限制了变换函数的斜率,其中对直方图进行切割所使用的阈值,被称作修剪限制度(clip limit),这个参数不仅依赖于直方图的归一化,而且依赖于像素邻域的size大小,通常设为3到4之间。

对于每个小块来说,如果直方图中的 bin 超过对灶明比度的上限的话,就把其中的像素点均匀分散到其他 bins 中,然后在进行直方图均衡化。最后,为了去除每一个小块之间“人造的”(由于算法造成)边界,再使用双线性差值,与原图做图层滤色混合操作(可选)。

实现:

参考文献:
网址: 直方图均衡化
Adaptive_histogram_equalization
书籍:《数字图像处理》《OpenCV-Python 中文教程》

阅读全文

与python图片直方图均一化相关的资料

热点内容
往复式压缩气缸过热的原因 浏览:839
4u服务器机箱怎么卖 浏览:461
如何自学葡萄牙语app 浏览:456
摆来摆去的游戏解压 浏览:270
centos注销命令 浏览:859
vue多端编译 浏览:753
程序员qq表白代码编辑 浏览:893
联想服务器怎么进后台 浏览:114
安卓定制rom怎么刷 浏览:539
三层交换机的配置命令 浏览:110
49算法公式 浏览:790
求最小生成树算法代码及运行图片 浏览:930
python扫雷计数 浏览:879
什么安卓手机品牌最保值 浏览:846
编程猫买房子 浏览:134
c语言系列编程 浏览:742
符合国标加密标准技术 浏览:497
加密狗接口会坏吗 浏览:625
javame开发 浏览:380
python3伪装浏览器 浏览:242