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)新建一个chapter12_06.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#encoding:utf-8
#By:Eastmount CSDN 2021-07-30
import cv2
import numpy as np
#读取图片
src = cv2.imread('test04.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((10,10), np.uint8)
#图像梯度运算
result = cv2.morphologyEx(src, cv2.MORPH_GRADIENT, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
保存.py文件
输入eixt()退出python,输入命令行进入工程文件目录
输入以下命令,跑起工程
python chapter12_06.py
没有报错,直接弹出图片,运行成功!
(2)新建一个chapter12_07.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#encoding:utf-8
#By:Eastmount CSDN 2021-07-30
import cv2
import numpy as np
#读取图片
src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((10,10), np.uint8)
#图像顶帽运算
result = cv2.morphologyEx(src, cv2.MORPH_TOPHAT, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
保存.py文件输入以下命令,跑起工程
python chapter12_07.py
没有报错,直接弹出图片,运行成功!
(3)新建一个chapter12_08.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
# -*- coding: utf-8 -*-
#By:Eastmount CSDN 2021-07-30
import numpy as np
import cv2 as cv
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from matplotlib import cm
from matplotlib.ticker import LinearLocator, FormatStrFormatter
#读取图像
img = cv.imread("test06.png")
img = cv.cvtColor(img,cv.COLOR_BGR2GRAY)
#图像黑帽运算
kernel = np.ones((10,10), np.uint8)
result = cv.morphologyEx(img, cv.MORPH_BLACKHAT, kernel)
#image类转numpy
imgd = np.array(result) #img 原图
#准备数据
sp = result.shape
h = int(sp[0]) #图像高度(rows)
w = int(sp[1]) #图像宽度(colums) of image
#绘图初始处理
fig = plt.figure(figsize=(8,6))
ax = fig.gca(projection="3d")
x = np.arange(0, w, 1)
y = np.arange(0, h, 1)
x, y = np.meshgrid(x,y)
z = imgd
surf = ax.plot_surface(x, y, z, cmap=cm.coolwarm)
#自定义z轴
ax.set_zlim(-10, 255)
ax.zaxis.set_major_locator(LinearLocator(10)) #设置z轴网格线的疏密
#将z的value字符串转为float并保留2位小数
ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f'))
# 设置坐标轴的label和标题
ax.set_xlabel('x', size=15)
ax.set_ylabel('y', size=15)
ax.set_zlabel('z', size=15)
ax.set_title("surface plot", weight='bold', size=20)
#添加右侧的色卡条
fig.colorbar(surf, shrink=0.6, aspect=8)
plt.show()
保存.py文件输入以下命令,跑起工程
python chapter12_08.py
没有报错,直接弹出图片,运行成功!
(4)新建一个chapter12_09.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#encoding:utf-8
#By:Eastmount CSDN 2021-07-30
import cv2
import numpy as np
#读取图片
src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED)
#设置卷积核
kernel = np.ones((10, 10), np.uint8)
#图像黑帽运算
result = cv2.morphologyEx(src, cv2.MORPH_BLACKHAT, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", result)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
保存.py文件输入以下命令,跑起工程
python chapter12_09.py
没有报错,直接弹出图片,运行成功!
(5)新建一个chapter12_10.py文件,输入以下代码,图片也放在与.py文件同级文件夹下
#encoding:utf-8
#By:Eastmount CSDN 2021-07-30
import cv2
import numpy as np
import matplotlib.pyplot as plt
#读取图片
src = cv2.imread('test06.png', cv2.IMREAD_UNCHANGED)
img = cv2.cvtColor(src,cv2.COLOR_BGR2RGB)
# 转化为灰度图
Grayimg = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
# 1、消除椒盐噪声:
# 中值滤波器
median = cv2.medianBlur(Grayimg, 5)
# 消除噪声图
cv2.imshow("median-image", median)
# 2、直方图均衡化:
equalize = cv2.equalizeHist(median)
cv2.imshow('hist', equalize)
# 3、二值化处理:
# 阈值为140
ret, binary = cv2.threshold(equalize, 127, 255,cv2.THRESH_BINARY)
cv2.imshow("binary-image",binary)
cv2.waitKey(0)
#设置卷积核
kernel = np.ones((10,10), np.uint8)
close = cv2.morphologyEx(binary, cv2.MORPH_CLOSE, kernel)
#图像开运算
kernel = np.ones((10,10), np.uint8)
open1 = cv2.morphologyEx(binary, cv2.MORPH_OPEN, kernel)
#显示图像
cv2.imshow("src", src)
cv2.imshow("result", close)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
#图像开运算
kernel = np.ones((10,10), np.uint8)
gradient = cv2.morphologyEx(binary, cv2.MORPH_GRADIENT, kernel)
# Sobel算子 XY方向求梯度 cv2.CV_8U
x = cv2.Sobel(close, cv2.CV_32F, 1, 0, ksize = 3) #X方向
y = cv2.Sobel(close, cv2.CV_32F, 0, 1, ksize = 3) #Y方向
#absX = cv2.convertScaleAbs(x) # 转回uint8
#absY = cv2.convertScaleAbs(y)
#Sobel = cv2.addWeighted(absX, 0.5, absY, 0.5, 0)
gradient = cv2.subtract(x, y)
sobel = cv2.convertScaleAbs(gradient)
cv2.imshow('Sobel', sobel)
cv2.waitKey(0)
#循环显示图形
titles = [ 'source', 'gray', 'median', 'equalize', 'binary', 'close', 'open', 'gradient', 'sobel']
images = [img, Grayimg, median, equalize, binary, close, open1, gradient, sobel]
for i in range(9):
plt.subplot(3, 3, i+1), plt.imshow(images[i], 'gray')
plt.title(titles[i])
plt.xticks([]),plt.yticks([])
plt.show()
保存.py文件输入以下命令,跑起工程
python chapter12_10.py
没有报错,直接弹出图片,运行成功!
三. 小结
本文主要介绍在Python中调用OpenCV库对图像进行形态学处理,包括梯度计算,顶帽变换,黑帽变换等操作。由于本书的介绍比较系统全面,所以会出一个系列文章进行全系列仿真实现,感兴趣的还是建议去原书第十二章深入学习理解,下一篇文章将继续介绍第十三章节的5例仿真实例。每天学一个Python小知识,大家一起来学习进步阿!
本系列示例主要参考杨老师GitHub源码,安利一下地址:ImageProcessing-Python(喜欢记得给个star哈!)