⚠申明: 未经许可,禁止以任何形式转载,若要引用,请标注链接地址。 全文共计3077字,阅读大概需要3分钟
🌈更多学习内容, 欢迎👏关注👀【文末】我的个人微信公众号:不懂开发的程序猿
个人网站:https://jerry-jy.co/❗❗❗知识付费,🈲止白嫖,有需要请后台私信或【文末】个人微信公众号联系我
基于OpenCv的图像二值图和灰度直方图
- 基于OpenCv的图像二值图和灰度直方图
- 任务需求
- 任务目标
- 1、掌握图像的灰度化和二值化
- 2、掌握绘制图像灰度直方图
- 任务环境
- 1、jupyter开发环境
- 2、OpenCv
- 3、python3.6
- 任务实施过程
- 一、图像的灰度化和二值化
- 1、图像灰度化
- 2、图像二值化
- 二、图像灰度直方图
- 三、任务小结
- 说明
基于OpenCv的图像二值图和灰度直方图
任务需求
本次实验主要完成基于OpenCv的图像二值化和绘制图像灰度直方图。
- 图像二值化就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的黑白效果。在数字图像处理中,二值图像占有非常重要的地位。图像的二值化有利于图像的进一步处理,能凸显出感兴趣的目标的轮廓。
- 图像灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。灰度直方图是将数字图像中的所有像素,按照灰度值的大小,统计其出现的频率。灰度直方图是灰度级的函数,它表示图像中具有某种灰度级的像素的个数,反映了图像中某种灰度出现的频率。
任务目标
1、掌握图像的灰度化和二值化
2、掌握绘制图像灰度直方图
任务环境
1、jupyter开发环境
2、OpenCv
3、python3.6
任务实施过程
一、图像的灰度化和二值化
1、图像灰度化
import cv2 # 导入opencv
import matplotlib.pyplot as plt # 导入绘图模块
import numpy as np # 导入numpy库
from utils import im_show # 导入显示图像函数
# 绘制图像直接展示,不用调用plt.show()
%matplotlib inline
# 用来正常显示中文标签
plt.rc('font',family="SimHei")
# 读取图像,这里读取的是彩色图像
img = cv2.imread(r'./experiment/data/Doraemon.jpg')
# 使用图像转换函数将彩色图像转换成灰度图
img_gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
print('原图图像矩阵形状',img.shape)
print('转换成灰度图后图像矩阵形状',img_gray .shape)
# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
# 显示原图
im_show('图像原图',img)
# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
# 显示灰度图
im_show('图像灰度图',img_gray)
2、图像二值化
- 二值图像,顾名思义就是图像的亮度值只有两个状态:黑(0)和白(255)。
- 二值化(Image Binarization)就是将灰度图转换成二值图像的一种方法,它将图像中感兴趣物体与背景分离。
ret, dst = cv2.threshold(src, thresh, maxval, type) 图像阈值函数,阈值通俗讲就是分界线,我们可以设置图像灰度大于阈值的,为一个值,低于阈值的,为另一个值。
- src: 输入图,只能输入单通道图像,通常来说为灰度图
- dst: 输出图
- thresh: 阈值
- maxval: 当像素值超过了阈值(或者小于阈值,根据type来决定),所赋予的值
- type:二值化操作的类型,包含以下5种类型: cv2.THRESH_BINARY; cv2.THRESH_BINARY_INV; cv2.THRESH_TRUNC; cv2.THRESH_TOZERO;cv2.THRESH_TOZERO_INV
- cv2.THRESH_BINARY (黑白二值)超过阈值部分取maxval(最大值),否则取0
# 对图像做简单的阈值化,也就是将图像二值化
# 这里设置阈值为127,maxval=255,表示图像灰度值大于127的设为255,小于的设为0
ret,dst = cv2.threshold(img_gray,127,255,cv2.THRESH_BINARY)
# 设置绘制图像的画布大小
plt.figure(figsize = (6,6))
# 显示图像的二值图
im_show('二值图',dst)
二、图像灰度直方图
灰度直方图是关于灰度级分布的函数,是对图像中灰度级分布的统计。
绘制直方图 plt.hist (x, bins=None, range=None,…)
- x:需要统计直方图的数据集
- bins:指定bin(箱子)的个数,也就是总共有几条条状图
- range:显示的范围
# 设置绘制图像的画布大小
plt.figure(figsize = (12,6))
# 绘制灰度图像直方图
# 可以直接使用plt.hist()函数绘制直方图
# numpy的ravel函数功能是将多维数组降为一维数组
plt.hist(img.ravel(), 256, [0, 256])
plt.title("灰度图像直方图")
plt.show()
使用opencv绘制直方图
cv2.calcHist(image,channels,mask,hitSize,range[,hist[,accumulate]])
- image:输入的图像
- Channels:表示通道,是计算直方图的通道索引。如果输入是灰度图像,则其值为[0],对于彩色图B,G,R分别传入[0],[1],[2]。
- Mask:要计算的区域ROI,计算整幅图的话,为None。
- histSize:也叫bins,子区段数目,如果我们统计0-255每个像素值,bins=256;如果划分区间,比如0-15, 16-31…240-255这样16个区间,bins=16
- Range:要计算的像素值范围,一般为[0,256]
# 绘制彩色图像直方图
# 设置直方图线颜色,这里需要与calcHist函数中Channels参数的值一一对应
color = ('r','g','b')
# 设置绘制图像的画布大小
plt.figure(figsize = (12,6))
for i,col in enumerate(color):
# 设定坐标系范围,并绘画直方图
histr = cv2.calcHist([img],[i],None,[256],[0,256])
plt.plot(histr,color = col)
# 设置x轴的数值显示范围
plt.xlim([0,256])
plt.title('彩色图像直方图')
plt.show()
三、任务小结
本次实验主要完成基于OpenCv的图像二值化和绘制图像灰度直方图。
通过本次实验需要掌握以下内容:
- 1.掌握图像的灰度化和二值化
- 2.掌握绘制图像灰度直方图
–end–
说明
本实验(项目)/论文若有需要,请后台私信或【文末】个人微信公众号联系我