【火炉炼AI】机器学习047-图像的直方图均衡化操作

【火炉炼AI】机器学习047-图像的直方图均衡化操作

(本文所使用的Python库和版本号: Python 3.6, Numpy 1.14, scikit-learn 0.19, matplotlib 2.2 )

图像的直方图是指图像中每一像素范围内像素频率的统计关系图,直方图能够给出图像灰度范围,每个灰度的频度和灰度的分布,整幅图的平均明暗,对比度等概貌性描述。灰度直方图是灰度级的函数,反映的是图像中具有该灰度级像素的个数。如果大部分像素都集中在低灰度区域,图像会呈现暗的特性,反之,如果大部分图像都集中在高灰度区域,图像呈现出亮的特性。

直方图均衡化是指,将随机分布的图像直方图修改成均匀分布的直方图,基本思想是对原始图像的像素灰度做某种映射变换,使得变换后的图像灰度的概率密度呈均匀分布,这就意味着图像灰度的动态范围得到扩大,提高了图像的对比度。


1. 获取图像直方图

图像直方图有灰度直方图和彩色直方图的区别,如果输入图像是灰度图,则得到灰度直方图,如果输入图像是BGR图像,得到的则是某个颜色通道的直方图。

# 获取灰度直方图
gray_hist=cv2.calcHist([gray], [0], None, [256], [0, 256])
plt.plot(gray_hist)
image

取得图像的灰度直方图,只需要调用cv2.calcHist()函数即可,这个函数的参数为:

第一个参数为输入的图像,可以是灰度图也可以是彩色图。

第二个参数是用于计算直方图的通道,这里使用灰度图计算直方图,所以就直接使用第一个通道;

第三个参数是Mask,这里没有使用,所以用None。

第四个参数是histSize,表示这个直方图分成多少份(即多少个直方柱)。

第五个参数是表示直方图中各个像素的值,[0.0, 256.0]表示直方图能表示像素值从0.0到256的像素。

最后是两个可选参数,由于直方图作为函数结果返回,所以第六个hist就没有意义了(待确定)

最后一个accumulate是一个布尔值,用来表示直方图是否叠加。

# 获取彩色图的各个通道直方图
hist_B=cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color

hist_G=cv2.calcHist([img],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G')  # green color

hist_R=cv2.calcHist([img],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('histogram of Color Chanel')
plt.legend()
image


2. 直方图均衡化

2.1 灰度图的直方图均衡化

为了方便对比,我将直方图均衡化前后的图像都绘制到同一个图片中。如下:

# 灰度图的直方图均衡化:
# 先显示均衡化前后的图像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
plt.imshow(gray,cmap='gray')
plt.title('GrayImg before Equalization')

equalize = cv2.equalizeHist(gray)
plt.subplot(122)
plt.imshow(equalize,cmap='gray')
plt.title('GrayImg after Equalization')
image
plt.plot(gray_hist,c='b',label='raw_Hist')

gray_equalized_hist=cv2.calcHist([equalize], [0], None, [256], [0, 256])
plt.plot(gray_equalized_hist,c='r',label='Equalized')

plt.legend()
plt.title('Histogram comparison')
image

话说,经过直方图均衡化之后的直方图怎么长的这么丑?

直方图均衡化只需要一个函数cv2.equalizeHist()即可,但是需要注意:cv2.equalizeHist()只提供灰度值图片的处理,当把上面的图片换成RGB图片时,就会报错了。

2.2 彩色图的直方图均衡化

彩色图的直方图均衡化需要借助YUV空间,如下代码:

# 彩色直方图均衡化需要借助YUV空间
img_yuv = cv2.cvtColor(img, cv2.COLOR_BGR2YUV)
img_yuv[:,:,0] = cv2.equalizeHist(img_yuv[:,:,0])
img_histeq = cv2.cvtColor(img_yuv, cv2.COLOR_YUV2BGR)

# 显示均衡化前后的图像
plt.figure(12,figsize=(15,30))
plt.subplot(121)
img_rgb=cv2.cvtColor(img,cv2.COLOR_BGR2RGB)
plt.imshow(img_rgb)
plt.title('ColorImg before Equalization')

plt.subplot(122)
img_hist_rgb=cv2.cvtColor(img_histeq,cv2.COLOR_BGR2RGB)
plt.imshow(img_hist_rgb)
plt.title('ColorImg after Equalization')
image
# 显示均衡化前后的直方图情况
plt.figure(12)

plt.subplot(121)
hist_B=cv2.calcHist([img],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color

hist_G=cv2.calcHist([img],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G')  # green color

hist_R=cv2.calcHist([img],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('Color Histogram before Equalization')
plt.legend()

plt.subplot(122)
hist_B=cv2.calcHist([img_histeq],[0],None,[256],[0,256])
plt.plot(hist_B,'b',label='B') # Blue color

hist_G=cv2.calcHist([img_histeq],[1],None,[256],[0,256])
plt.plot(hist_G,'g',label='G')  # green color

hist_R=cv2.calcHist([img_histeq],[2],None,[256],[0,256])
plt.plot(hist_R,'r',label='R')# red color
plt.title('Color Histogram after Equalization')
plt.legend()
image

同样的,经过对比可以看出,经过直方图均衡化之后的图像直方图都比较丑。。。。

########################小**********结###############################

1,对于图像直方图进行操作可以比较明显的改变图像的对比度和明暗度。

2,使用cv2.equalizeHist函数可以直接改变灰度图的直方图,但是却不能直接改变彩色图的直方图,对于彩色图如果想要均衡化,需要先转变到YUV空间再进行转换。

#################################################################


注:本部分代码已经全部上传到(我的github)上,欢迎下载。

参考资料:

1, Python机器学习经典实例,Prateek Joshi著,陶俊杰,陈小莉译

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,723评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,003评论 3 391
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 161,512评论 0 351
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,825评论 1 290
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,874评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,841评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,812评论 3 416
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,582评论 0 271
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,033评论 1 308
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,309评论 2 331
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,450评论 1 345
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,158评论 5 341
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,789评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,409评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,609评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,440评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,357评论 2 352

推荐阅读更多精彩内容