万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文

Posted Eastmount

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了万字长文告诉新手如何学习Python图像处理(上篇完结 四十四) | 「Python」有奖征文相关的知识,希望对你有一定的参考价值。

该系列文章是讲解Python OpenCV图像处理知识,前期主要讲解图像入门、OpenCV基础用法,中期讲解图像处理的各种算法,包括图像锐化算子、图像增强技术、图像分割等,后期结合深度学习研究图像识别、图像分类应用。希望文章对您有所帮助,如果有不足之处,还请海涵~

这篇文章是图像处理的最后一篇文章,后面我们将进入新的章节。图像处理文章主要讲解的图像处理方法包括图像几何运算、图像量化采样、图像点运算、图像形态学处理、图像增强、图像平滑、图像锐化、图像特效、图像分割、傅里叶变换与霍夫变换、图像分类等。个人感觉如果你是编程初学者、Python初学者或图像处理爱好者,这个系列真心适合你学习,并且这篇文章算是Python图像处理的学习路线,希望您喜欢。

万字长文整理,希望对您有所帮助。同时,该部分知识均为作者查阅资料撰写总结,并且开设成了收费专栏,为小宝赚点奶粉钱,感谢您的抬爱。如果有问题随时私聊我,只望您能从这个系列中学到知识,一起加油。代码下载地址(如果喜欢记得star,一定喔):


一.Python图像处理绪论

图像处理是通过计算机对图像进行分析以达到所需结果的技术。常见的方法包括图像变换、图像运算、图像增强、图像分割、图像复原、图像分类等,广泛应用于制造业、生物医学、商品防伪、文物修复、图像校验、模式识别、计算机视觉、人工智能、多媒体通信等领域。

随着大数据和人工智能风暴的来临,Python语言也变得越来越火热,其清晰的语法、丰富和强大的功能,让Python迅速运用于各个领域。该系列博客主要通过Python语言来实现各式各样的图像处理算法及案例,有效地辅助读者学习图像处理知识,并运用于自己的科研、工作或学习中。

1.数字图像处理

数字图像处理(Digital Image Processing)又称为计算机图像处理(Computer Image Processing),旨在将图像信号转换成数字信号并利用计算机对其进行处理的过程。其运用领域如图所示,涉及通信、生物医学、物理化学、经济等。

数字图像处理最早出现于20世纪50年代,当时的电子计算机已经发展到一定水平,人们开始利用计算机来处理图形和图像信息。数字图像处理作为一门学科大约形成于20世纪60年代初期。早期的图像处理的目的是改善图像的质量,常用的处理方法包括图像增强、复原、编码、压缩等。1979年,无损伤诊断技术获得了诺贝尔奖,说明它对人类作出了划时代的贡献。与此同时,图像处理技术在许多应用领域受到广泛重视并取得重大开拓性成就,包括航空航天、生物医学工程、工业检测、机器人视觉、公安司法、军事制导、文化艺术等领域,使图像处理成为一门引人注目、前景远大的新型学科。

随着图像处理技术的深入发展,从70年代中期开始,计算机技术和人工智能、思维科学研究迅速发展,数字图像处理向更高、更深层次发展。人们已开始研究如何用计算机系统解释图像,实现类似人类视觉系统理解外部世界,这被称为图像理解或计算机视觉。现如今,这项研究取得了不少重要的研究成果。数字图像处理在国民经济的许多领域已经得到广泛的应用。


2.Python

随着大数据、深度学习、人工智能、图像识别的迅速发展,图像处理和计算机视觉也变得越来越热门。由于Python具有语法清晰、代码友好、易读性好等特点,同时拥有强大的第三方库支持,包括网络爬取、信息传输、数据分析、图像处理、绘图可视化等库函数,该系列文章选择了Python作为图像处理的编程语言。

Python是Guido van Rossum在1989年开发的一门语言,它既是解释性编程语言,又是面向对象的语言,其操作性和可移植性高,被广泛应用于数据挖掘、图像处理、人工智能领域。Python具有语言清晰、容易学习、高效率的数据结构、丰富且功能强大的第三方包等优势,使其成为一种能在多种功能、多种平台上撰写脚本及快速开发的理想语言。

该系列文章主要通过Python调用OpenCV、Matplotlib、Numpy、Sklearn等第三方包实现图像处理,其优雅清晰的语法结构减少了读者的负担,从而大大增强程序的质量。


3.OpenCV

OpenCV(Open Source Computer Vision)直译为“开源计算机视觉库”,它是一个开放源代码的图像及视频分析库,是进行图像处理的一款必备工具。自1999年问世以来,它已经被图像处理和计算机视觉领域的学者和开发人员视为首选工具。OpenCV可以运行在Linux、Windows、android和Mac 操作系统上。它是一个由C/C++语言编写而成的轻量级并且高效的库,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。其官方地址为:

下图是OpenCV的Logo图,其设计目标是执行速度更快,更加关注实时应用。采用优化的C/C++代码编写而成,能够充分利用多核处理器的优势,构建一个简单易用的计算机视觉框架。OpenCV被广泛应用于产品检测、医学成像、立体视觉、图像识别、图像增强、图像恢复等领域。本书主要通过Python语言结合OpenCV库实现图像处理相关的算法及案例,并强化读者的印象。


4.内容分布

本系列为满足广泛的读者需求,结合Python语言实现各种图像处理,主要包括四部分内容,如图所示。

  • 第一部分 基础知识
    该部分主要讲解基础知识,包括第二章Python基础、第三章数字图像处理基础和第四章Python图像处理入门。第一部分重点介绍了Python基础语法、数据类型、基本语句和操作、数字图像处理概念、OpenCV初识、Numpy和Matplotlib、几何图像绘制、OpenCV读取显示图像、OpenCV读取修改像素、图像算数与逻辑运算、图像融合、图像类型转换等。

  • 第二部分 图像运算
    该部分为核心知识,主要讲述Python图像运算,包括第五章Python图像几何变换、第六章Python图像量化采样处理、第七章Python图像点运算处理、第八章Python图像形态学处理。图像几何变换涉及图像平移变换、缩放变换、旋转变换、镜像变换、仿射变换、透视变换,图像量化及采样处理涉及量化处理、K-Means聚类量化处理、采样处理、局部马赛克处理、图像向下取样、图像向上取样,图像点运算涉及图像灰度化处理(灰度线性变换、灰度非线性变换)、图像阈值化处理(固定阈值化处理、自适应阈值化处理),图像形态学处理涉及图像腐蚀、膨胀、开运算、闭运算、梯度运算、顶帽运算和底帽运算。

  • 第三部分 图像增强
    图像增强是指按照某种特定的需求,突出图像中有用的信息,去除或者削弱无用的信息。该部分包括第九章Python直方图统计、第十章Python图像增强、第十一章Python图像平滑、第十二章Python图像锐化。其中,图像直方图涉及Matplotlib绘制直方图、OpenCV绘制直方图、掩膜直方图、图像灰度变换直方图对比、图像H-S直方图、直方图判断黑夜白天等,图像增强涉及直方图均衡化、局部直方图均衡化、自动色彩均衡化,图像平滑涉及均值滤波、方框滤波、高斯滤波、中值滤波、双边滤波,图像锐化涉及Roberts算子、Prewitt算子、Sobel算子、Laplacian算子、Scharr算子、Canny算子、LOG算子。

  • 第四部分 高阶图像处理
    高阶图像处理部分主要包括第十三章Python图像特效、第十四章Python图像分割、第十五章Python傅里叶变换与霍夫变换、第十六章Python图像分类。其中,图像特效涉及图像毛玻璃特效、浮雕特效、油漆特效、素描特效、怀旧特效、光照特效、流年特效、水波特效、卡通特效、滤镜特效、直方图均衡化特效、模糊特效,图像分割涉及基于阈值的图像分割、基于边缘检测的图像分割、基于纹理背景的图像分割、基于K-Means聚类的区域分割、基于均值漂移算法的图像分割、基于分水岭算法的图像分割、图像漫水填充分割、文字区域定位及提取,傅里叶变换与霍夫变换涉及图像傅里叶变换操作、高通滤波和低通滤波、图像霍夫线变换操作、图像霍夫圆变换操作,图像分类涉及基于朴素贝叶斯算法的图像分类、基于KNN算法的图像分类、基于神经网络算法的图像分类。

博客划分:


二.基础知识

Python图像处理第一部分为“基础知识”,主要包括Python基础知识、数字图像处理、Python图像处理入门。

1.Python基础

核心内容:

  • Python简介
  • 基础语法
    – 输出语句
    – 注释
    – 变量及赋值
    – 输入语句
  • 数据类型
    – 数字类型
    – 字符串类型
    – 列表类型
    – 字典类型
    – 元组类型
  • 基本语句
    – 条件语句
    – 循环语句
  • 基本操作
    – 自定义函数
    – 第三方包
    – 面向对象

2.数字图像处理基础

推荐文章:

核心内容:

  • 数字图像处理概述
  • 像素及常见图像分类
  • 图像信号数字化处理
  • OpenCV安装配置
  • OpenCV初识及常见数据类型
    – OpenCV显示图像:imshow(winname, mat)
    – 常见数据类型
  • Numpy和Matplotlib库介绍
    – Numpy库
    – Matplotlib库
  • 几何图形绘制
    – 绘制直线
    img = line(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    – 绘制矩形
    img = rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])
    – 绘制圆形
    img = circle(img, center, radius, color[, thickness[, lineType[, shift]]])
    – 绘制椭圆
    img = ellipse(img, center, axes, angle, startAngle, endAngle, color[, thickness[, lineType[, shift]]])
    – 绘制多边形
    img = polylines(img, pts, isClosed, color[, thickness[, lineType[, shift]]])
    – 绘制文字
    img = putText(img, text, org, fontFace, fontScale, color[, thickness[, lineType[, bottomLeftOrigin]]])

经典知识:
数字图像处理技术广泛应用于各行各业,它主要是将现实物体离散化处理后转换为信号数字图像,从而更好地进行后续的图像处理和图像识别等操作。下图展示了图像信号数字化处理的过程。

下图展示了图像中某一点像素(205,89,68)所对应三原色像的素值,其中R表示红色分量、G表示绿色分量、B表示蓝色分量。

下面介绍OpenCV中常见的数据类型,包括点Point类、颜色Scalar类、尺寸Size类、矩形Rect类、矩阵Mat类,如下表所示。

经典示例:
(1) 显示多张图像
在OpenCV中,主要调用Matplotlib绘制显示多张图形,从而方便实验对比,如下代码所示。它调用cv2.imread()函数分别读取四张图片,并转换为RGB颜色空间,接着通过for循环分别设置各子图对应的图像、标题及坐标轴名称,其中plt.subplot(2,2)表示生成2×2张子图。

# -*- coding: utf-8 -*-
# By:Eastmount CSDN
import cv2  
import numpy as np  
import matplotlib.pyplot as plt

#读取图像
img1 = cv2.imread('lena.png')
img1 = cv2.cvtColor(img1, cv2.COLOR_BGR2RGB)

img2 = cv2.imread('people.png')
img2 = cv2.cvtColor(img2, cv2.COLOR_BGR2RGB)

img3 = cv2.imread('flower.png')
img3 = cv2.cvtColor(img3, cv2.COLOR_BGR2RGB)

img4 = cv2.imread('scenery.png')
img4 = cv2.cvtColor(img4, cv2.COLOR_BGR2RGB)

#显示四张图像
titles = ['lena', 'people', 'flower', 'scenery']
images = [img1, img2, img3, img4]
for i in range(4):
   plt.subplot(2, 2, i+1), plt.imshow(images[i], 'gray')
   plt.title(titles[i])
   plt.xticks([]),plt.yticks([])
plt.show()

显示效果如下图所示:

(2) 几何图形绘制

# -*- coding: utf-8 -*-
# By:Eastmount CSDN
import cv2
import numpy as np

#创建黑色图像
img = np.zeros((512,512,3), np.uint8)

#(1)绘制直线:图像、起点坐标、终点坐标、颜色、粗细
cv2.line(img, (0,0), (512,512), (55,255,155), 5)

#(2)绘制矩形:图像、左上角坐标、右下角坐标、颜色、粗细
cv2.rectangle(img, (20,300), (350,450), (255,0,0), 2)

#(3)绘制圆形:图像、圆心坐标、半径、颜色、粗细\\填充
cv2.circle(img, (400,400), 50, (255,255,0), -1)

#(4)绘制椭圆:图像、圆心坐标、长轴和短轴、偏转角度20
# 圆弧起始角的角度、圆弧终结角的角度、颜色、线条粗细
cv2.ellipse(img, (320, 100), (100, 50), 20, 0, 360, (255, 0, 255), 2)

#(5)绘制多边形:图像、多边形曲线阵列、是否闭合、颜色、粗细
pts = np.array([[10,80], [120,80], [120,200], [30,250]])
cv2.polylines(img, [pts], True, (255, 255, 255), 5)

#(6)绘制多边形
pts = np.array([[50, 190], [380, 420], [255, 50], [120, 420], [450, 190]])
cv2.polylines(img, [pts], True, (0, 255, 255), 1)

#(7)绘制文字
font = cv2.FONT_HERSHEY_SIMPLEX
cv2.putText(img, 'I love Python!!! By:Eatmount CSDN',
            (10, 500), font, 0.6, (255, 255, 0), 2)

#显示图像
cv2.imshow("img", img)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下图所示:


3.Python图像处理入门

推荐文章:

核心内容:

  • OpenCV读取显示图像
    cv2.imshow("Demo", img)
  • OpenCV读取修改像素
    blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]
    blue = img.item(78, 100, 0)
    img.itemset((88,99), 255)
  • OpenCV创建复制保存图像
    emptyImage2 = img.copy()
    retval = imwrite(filename, img[, params])
  • 获取图像属性及通道
    – 图像属性:shape、size、dtype
    – 图像通道处理:split、merge
  • 图像算数与逻辑运算
    – 图像加法运算
    dst = add(src1, src2[, dst[, mask[, dtype]]])
    – 图像减法运算
    dst = subtract(src1, src2[, dst[, mask[, dtype]]])
    – 图像与运算
    dst = bitwise_and(src1, src2[, dst[, mask]])
    – 图像或运算
    dst = bitwise_or(src1, src2[, dst[, mask]])
    – 图像异或运算
    dst = bitwise_xor(src1, src2[, dst[, mask]])
    – 图像非运算
    dst = bitwise_not(src1, src2[, dst[, mask]])
  • 图像融合处理
  • 获取图像ROI区域
  • 图像类型转换

经典知识:

OpenCV读取的彩色图像由蓝色(B)、绿色(G)、红色(R)三原色组成,每一种颜色可以认为是一个通道分量,如图所示。

图像的算法运算与逻辑运算,主要包括图像加法、图像减法、图像与运算、图像或运算、图像异或运算与图像非运算。

经典示例:
(1) 图片拆分与合并

# -*- coding:utf-8 -*-
# By: Eastmount CSDN 2021-08-19
import cv2
import numpy as np

#读取图片
img = cv2.imread("Lena.png")
rows, cols, chn = img.shape
print(rows, cols, chn)
cv2.imshow("img", img)

#(1)拆分通道
b, g, r = cv2.split(img)
cv2.imshow("B", b)
cv2.imshow("G", g)
cv2.imshow("R", r)

#(2)合并通道
m = cv2.merge([b, g, r])
cv2.imshow("Merge", m)

#(3)显示蓝色通道
b_ = cv2.split(img)[0]
g_ = np.zeros((rows,cols), dtype=img.dtype) #设置g、r通道为0
r_ = np.zeros((rows,cols), dtype=img.dtype)
m = cv2.merge([b_, g_, r_])
cv2.imshow("MergeBlue", m)
cv2.imwrite("MergeBlue.png", m)

#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()

输出结果如下图所示:

(2) 图像算数与逻辑运算

# -*- coding:utf-8 -*-
# By: Eastmount CSDN 2021-08-19
import cv2  
import numpy as np
import matplotlib.pyplot as plt
 
#读取图片
src = cv2.imread("Lena.png")

#获取图像宽和高
rows, cols = src.shape[:2]

#BGR转换为RGB
img = cv2.cvtColor(src, cv2.COLOR_BGR2RGB)

#(1)OpenCV加法运算
m = np.ones(img.shape, dtype="uint8")*100 #图像各像素加100
result1 = cv2.add(img, m)

#(2)OpenCV减法运算
m = np.ones(img.shape, dtype="uint8")*50  #图像各像素减50
result2 = cv2.subtract(img, m)

#(3)画圆形
circle = np.zeros((rows, cols, 3), dtype="uint8")
cv2.circle(circle, (int(rows/2.0), int(cols/2)), 100, (255,0,0), -1)
print(circle.shape,img.size, circle.size)

#(4)OpenCV图像与运算
result4 = cv2.bitwise_and(img, circle)

#(5)OpenCV图像或运算
result5 = cv2.bitwise_or(img, circle)

#(6)OpenCV图像异或运算
result6 = cv2.bitwise_xor(img, circle)

#(7)OpenCV图像非运算
result7 = cv2.bitwise_not(img)

#解决中文显示问题
plt.rcParams['font.sans-serif'] = ['KaiTi']  #指定默认字体
plt.rcParams['axes.unicode_minus'] = False   #解决保存图像是负号

#显示九张图像
titles = ['原图', 'RGB', '加法', '减法', '圆形', '与运算', '或运算', '异或运算', '非运算']
images = [src, img, result1, result2, circle, result4, result5, result6, result7]
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()

输出结果如下图所示:

(3) 图像融合处理与获取图像ROI区域

#encoding:utf-8
# By: Eastmount CSDN 2021-08-19
import cv2  
import numpy as np  
import matplotlib.pyplot as plt
 
#读取图片
src1 = cv2.imread('lena-hd.png')
src2 = cv2.imread('na.png')
src3 = cv2.imread("Lena.png")
print(src3.shape)

#图像融合
res1 = cv2.addWeighted(src1, 0.6, src2, 0.8, 10)

#显示ROI区域
face = np万字长文分享,新手小白如何自学Java(方法+步骤)

万字长文别再报班了,一篇文章带你入门Python

史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

OpenCV-Python实战——OpenCV常见图像处理技术(❤️万字长文,含大量示例❤️)

OpenCV-Python实战——OpenCV图像运算(❤️万字长文,含大量示例❤️)

重磅干货 | 五万字长文总结 C/C++ 知识(上)