Python图像处理算法实现【1】《绘制直方图、直方图均衡化》

直接上代码:
#!/usr/bin/env python
# -*- coding:utf-8 -*- 
# Author: Hren
import cv2
import numpy as np
import matplotlib.pyplot as plt

image = cv2.imread('../image/0.jpg')     # 读入RGB图像
rows,cols,_=image.shape
image = cv2.resize(image, (cols//4, rows//4))  # 原图太大,resize为原图1/16
rows,cols,ch=image.shape
print('行/高:',rows,'列/宽:',cols,'通道:',ch)
image = cv2.cvtColor(image, cv2.COLOR_RGB2GRAY)
cv2.imshow('image', image)

plt.subplot(1,2,1)
# 第一种 按照原理绘制直方图
hist = np.zeros(256)    # 灰度直方图一维数组
for i in range(rows):
    for j in range(cols):
        hist[image[i, j]] +=1   # 灰度值所对应的数组位置计数加1
plt.plot(hist, 'black')

# 第二种 Matplotlib绘制直方图
plt.hist(image.ravel(), 256, [0, 256], color='r')

# 直方图均衡化
G = image.copy()
p_hist = hist/(rows * cols)     # 计算原图灰度分布概率
p_add_hist = [0]*256            # 计算原图灰度累计分布概率
p_add = p_hist[0]
for i in range(1, len(hist)):
    p_add += p_hist[i]
    p_add_hist[i] = p_add
for i in range(rows):
    for j in range(cols):
        G[i, j] = p_add_hist[image[i, j]]*255   # 直方图均衡化后图像
cv2.imshow('G', G)

plt.subplot(1,2,2)
# Matplotlib绘制直方图
plt.hist(G.ravel(), 256, [0, 256], color='r')
plt.show()  # 两种直方图绘制在一张图上

cv2.waitKey(0)
cv2.destroyAllWindows()
处理结果:
原图(左)&直方图均衡化后(右)

可以看到,经过直方图均衡化后可看出图片效果比之前好了许多,远处的云变得更加清晰。

均衡化前后直方图比较:
在这里插入图片描述

基于灰度直方图的阈值分割:

在某种意义上,之所以说用两个峰之间的最低谷(谷点)的灰度值作为阈值来确定阈值分割是最适宜的,是因为直方图是面积函数的导数。在谷底附近,直方图的值相对较小,意味着面积函数随阈值灰度级的变化很缓慢。如果我们选择谷底处的灰度值作为阈值可以使其对物体边界的影响达到最小。
根据均衡化之前的直方图,可以看出谷底处的灰度值大概是200。阈值分割效果如下:

代码如下:
# 利用直方图谷底灰度值进行阈值分割
threshold = image.copy()
for i in range(rows):
    for j in range(cols):
        if threshold[i, j] <= 200:
            threshold[i, j] = 0
        else:
            threshold[i, j] = 255
cv2.imshow('threshold', threshold)
cv2.imwrite('../csdn/threshold.png', threshold)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值