Python中的图像处理(第八章)Python直方图统计(2)
前言
随着人工智能研究的不断兴起,Python的应用也在不断上升,由于Python语言的简洁性、易读性以及可扩展性,特别是在开源工具和深度学习方向中各种神经网络的应用,使得Python已经成为最受欢迎的程序设计语言之一。由于完全开源,加上简单易学、易读、易维护、以及其可移植性、解释性、可扩展性、可扩充性、可嵌入性:丰富的库等等,自己在学习与工作中也时常接触到Python,这个系列文章的话主要就是介绍一些在Python中常用一些例程进行仿真演示!
本系列文章主要参考杨秀章老师分享的代码资源,杨老师博客主页是Eastmount,杨老师兴趣广泛,不愧是令人膜拜的大佬,他过成了我理想中的样子,希望以后有机会可以向他请教学习交流。
因为自己是做图像语音出身的,所以结合《Python中的图像处理》,学习一下Python,OpenCV已经在Python上进行了多个版本的维护,所以相比VS,Python的环境配置相对简单,缺什么库直接安装即可。本系列文章例程都是基于Python3.8的环境下进行,所以大家在进行借鉴的时候建议最好在3.8.0版本以上进行仿真。本文继续来对本书第八章的5个例程进行介绍。
一. Python准备
如何确定自己安装好了python
win+R输入cmd进入命令行程序
点击“确定”
输入:python,回车
看到Python相关的版本信息,说明Python安装成功。
二. Python仿真
(1)新建一个chapter08_06.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
#读取图像
img = cv2.imread('yxz.png')
#转换为RGB图像
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
#设置掩膜
mask = np.zeros(img.shape[:2], np.uint8)
mask[100:300, 100:300] = 255
masked_img = cv2.bitwise_and(img, img, mask=mask)
#图像直方图计算
hist_full = cv2.calcHist([img], [0], None, [256], [0,256]) #通道[0]-灰度图
#图像直方图计算(含掩膜)
hist_mask = cv2.calcHist([img], [0], mask, [256], [0,256])
plt.figure(figsize=(8, 6))
#设置字体
matplotlib.rcParams['font.sans-serif']=['SimHei']
#原始图像
plt.subplot(221)
plt.imshow(img_rgb, 'gray')
plt.axis('off')
plt.title("(a)原始图像")
#绘制掩膜
plt.subplot(222)
plt.imshow(mask, 'gray')
plt.axis('off')
plt.title("(b)掩膜")
#绘制掩膜设置后的图像
plt.subplot(223)
plt.imshow(masked_img, 'gray')
plt.axis('off')
plt.title("(c)图像掩膜处理")
#绘制直方图
plt.subplot(224)
plt.plot(hist_full)
plt.plot(hist_mask)
plt.title("(d)直方图曲线")
plt.xlabel("x")
plt.ylabel("y")
plt.show()
保存.py文件
输入eixt()退出python,输入命令行进入工程文件目录
输入以下命令,跑起工程
python chapter08_06.py
没有报错,直接弹出图片,运行成功!
(2)新建一个chapter08_07.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena.bmp')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)
#图像灰度上移变换 DB=DA+50
for i in range(height):
for j in range(width):
if (int(grayImage[i,j]+50) > 255):
gray = 255
else:
gray = int(grayImage[i,j]+50)
result[i,j] = np.uint8(gray)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,255])
#计算灰度变换的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#绘制掩膜设置后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#绘制直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
保存.py文件输入以下命令,跑起工程
python chapter08_07.py
没有报错,直接弹出图片,运行成功!
(3)新建一个chapter08_08.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena.bmp')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)
#图像对比度减弱变换 DB=DA×0.8
for i in range(height):
for j in range(width):
gray = int(grayImage[i,j]*0.8)
result[i,j] = np.uint8(gray)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,255])
#计算灰度变换的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#绘制掩膜设置后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#绘制直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
保存.py文件输入以下命令,跑起工程
python chapter08_08.py
没有报错,直接弹出图片,运行成功!
(4)新建一个chapter08_09.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena.bmp')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)
#图像灰度反色变换 DB=255-DA
for i in range(height):
for j in range(width):
gray = 255 - grayImage[i,j]
result[i,j] = np.uint8(gray)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,255])
#计算灰度变换的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制掩膜
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#绘制掩膜设置后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#绘制直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
保存.py文件输入以下命令,跑起工程
python chapter08_09.py
没有报错,直接弹出图片,运行成功!
(5)新建一个chapter08_10.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#coding:utf-8
#By:Eastmount CSDN 2021-02-05
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图像
img = cv2.imread('lena.bmp')
#图像灰度转换
grayImage = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
#获取图像高度和宽度
height = grayImage.shape[0]
width = grayImage.shape[1]
result = np.zeros((height, width), np.uint8)
#图像灰度对数变换
for i in range(height):
for j in range(width):
gray = 42 * np.log(1.0 + grayImage[i,j])
result[i,j] = np.uint8(gray)
#计算原图的直方图
hist = cv2.calcHist([img], [0], None, [256], [0,255])
#计算灰度变换的直方图
hist_res = cv2.calcHist([result], [0], None, [256], [0,255])
#原始图像
plt.figure(figsize=(8, 6))
plt.subplot(221), plt.imshow(img, 'gray'), plt.title("(a)"), plt.axis('off')
#绘制原始图像直方图
plt.subplot(222), plt.plot(hist), plt.title("(b)"), plt.xlabel("x"), plt.ylabel("y")
#灰度变换后的图像
plt.subplot(223), plt.imshow(result, 'gray'), plt.title("(c)"), plt.axis('off')
#灰度变换图像的直方图
plt.subplot(224), plt.plot(hist_res), plt.title("(d)"), plt.xlabel("x"), plt.ylabel("y")
plt.show()
保存.py文件输入以下命令,跑起工程
python chapter08_10.py
没有报错,直接弹出图片,运行成功!
三. 小结
本文主要介绍在Python中调用OpenCV库对图像各种变换(如上移变换,对比度变换,反色变换,对数变换等)后的图像,进行直方图统计后的对比等操作。由于本书的介绍比较系统全面,所以会出一个系列文章进行全系列仿真实现,下一篇文章将继续介绍第八章节的最后5例仿真实例,感兴趣的还是建议去原书第八章深入学习理解。每天学一个Python小知识,大家一起来学习进步阿!
本系列示例主要参考杨老师GitHub源码,安利一下地址:ImageProcessing-Python(喜欢记得给个star哈!)