本篇文章作为第一篇,将讲解图像处理基础知识和OpenCV入门函数,知识点如下:
- 一.图像基础知识
- 二.OpenCV读写图像
- 三.OpenCV像素处理御
学Python近八年,认识了很多大佬和朋友,感恩。由于在外求学且需要养娃,故在CSDN设置成了最低价收费专栏,觉得不错的可以购买抬爱;但作者的本意是帮助更多初学者入门,因此在github开源了所有代码,也在公众号同步更新。深知自己很菜,得拼命努力前行,编程也没有什么捷径,干就对了。希望未来能更透彻学习和撰写文章,同时非常感谢参考文献中的大佬们的文章和分享,共勉。 - https://blog.csdn.net/eastmount
一.图像基础知识
数字图像处理(Digital Image Processing)又称为计算机图像处理(Computer Image Processing),旨在将图像信号转换成数字信号并利用计算机对其进行处理的过程。其运用领域如下图所示,涉及通信、生物医学、物理化学、经济等。
常见的数字图像处理方法包括:
v算术处理(Arithmetic Processing)
v几何处理(Geometrical Processing)
v图像增强(Image Enhancement)
v图像识别(Image Recognition)
v图像分类(Image Classification)
v图像复原(Image Restoration)
v图像重建(Image Reconstruction)
v图像编码(Image Encoding)
v图像理解(Image Understanding)
图像都是由像素(pixel)构成的,即图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
图像通常分为二值图像、灰度图像和彩色图像,下图展示了图像处理经典“Lena”图的各种图像。
1.二值图像 二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。
如图所示,一幅二值图像对应的矩阵。
2.灰度图像 灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:
- 浮点算法:Gray=R0.3 G0.59 B0.11
- 整数方法:Gray=(R30 G59 B11)/100
- 移位方法:Gray=(R28 G151 B77)>>8
- 平均值法:Gray=(R G B)/3
- 仅取绿色:Gray=G
- 加权平均值算法:根据光亮度特性,公式 R=G=B=R0.299 G*0.587 B0.144
通过上述任一种方法求得Gray后,将原来的RGB(R,G,B)中的R,G,B统一用Gray替换,形成新的颜色RGB(Gray,Gray,Gray),用它替换原来的RGB(R,G,B)就是灰度图了。改变象素矩阵的RGB值,来达到彩色图转变为灰度图。
将彩色图像转换为灰度图是图像处理的最基本预处理操作。如下图所示:
3.彩色图像
彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。RGB (Red红色,Green 绿色,Blue 蓝色),是根据人眼识别的颜色而定义的空间,可用于表示大部分颜色,也是图像处理中最基本、最常用、面向硬件的颜色空间,是一种光混合的体系。
彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。
在RGB模型的立方体中,原点对应的颜色为黑色,它的三个分量值都为0;距离原点最远的顶点对应的颜色为白色,三个分量值都为1;从黑色到白色的灰度值分布在这两个点的连线上,该虚线称为灰度线;立方体的其余各点对应不同的颜色,即三原色红、绿、蓝及其混合色黄、品红、青色。下图表示彩色图像对应的RGB三原色矩阵图。
二.OpenCV读写图像
OpenCV(Open Source Computer Vision)直译为“开源计算机视觉库”,它是一个开放源代码的图像及视频分析库,是进行图像处理的一款必备工具。自1999年问世以来,它已经被图像处理和计算机视觉领域的学者和开发人员视为首选工具。OpenCV可以运行在Linux、Windows、Android和Mac 操作系统上。它是一个由C/C 语言编写而成的轻量级并且高效的库,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。其官方地址为:
- https://opencv.org/
下图是OpenCV的Logo图,其设计目标是执行速度更快,更加关注实时应用。采用优化的C/C 代码编写而成,能够充分利用多核处理器的优势,构建一个简单易用的计算机视觉框架。OpenCV被广泛应用于产品检测、医学成像、立体视觉、图像识别、图像增强、图像恢复等领域。本书主要通过Python语言结合OpenCV库实现图像处理相关的算法及案例,并强化读者的印象。
本文主要使用Python和OpenCV进行讲解,首先调用"pip install opencv-python"安装OpenCV库,如下图所示:
1.读入图像 OpenCV读图像主要调用下面函数实现:
img = cv2.imread(文件名,[,参数]) 1) cv2.IMREAD_UNCHANGED (图像不可变) 2) cv2.IMREAD_GRAYSCALE (灰度图像) 3) cv2.IMREAD_COLOR (读入彩色图像) 4) cv2.COLOR_BGR2RGB (图像通道BGR转成RGB)
2.显示图像 显示图像调用函数如下:
cv2.imshow(窗口名, 图像名)
3.窗口等待 调用函数如下:
cv2.waitKey(delay) 键盘绑定函数,共一个参数,表示等待毫秒数,将等待特定的几毫秒,看键盘是否有输入,返回值为ASCII值。如果其参数为0,则表示无限期的等待键盘输入;参数>0表示等待delay毫秒;参数<0表示等待键盘单击。
4.删除所有窗口 调用函数如下:
cv2.destroyAllWindows() 删除所有窗口 cv2.destroyWindows() 删除指定的窗口
5.写入图片 调用函数如下:
retval = cv2.imwrite(文件地址, 文件名)
下面代码是读入图片并显示保存。
代码语言:javascript复制# -*- coding:utf-8 -*-
import cv2
#读取图片
img = cv2.imread("yxz.png")
#显示图像
cv2.imshow("Demo", img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
#写入图像
cv2.imwrite("testyxz.jpg", img)
输出结果如下图所示,并且在文件夹下保存了一张名为“testyxz.jpg”的图像。
如果代码中没有watiKey(0)函数,则运行结果如下图所示:
同时可以对代码进行升级,如下所示,点击ESC键退出。
代码语言:javascript复制#无限期等待输入
k=cv2.waitKey(0)
#如果输入ESC退出
if k==27:
cv2.destroyAllWindows()
三.OpenCV像素处理
1.读取像素 灰度图像直接返回灰度值,彩色图像则返回B、G、R三个分量。注意OpenCV读取图像是BGR存储显示,需要转换为RGB再进行图像处理。
灰度图像:返回值 = 图像(位置参数) eg: test=img[88,42] 彩色图像:返回值 = 图像[位置元素, 0 | 1 | 2 ] 获取BGR三个通道像素 eg: blue=img[88,142,0] green=img[88,142,1] red=img[88,142,2]
2.修改图像 修改图像如果是灰度图像则直接赋值新像素即可,彩色图像依次给三个值赋值即可。
灰度图像: img[88,142] = 255 彩色图像: img[88,142, 0] = 255 img[88,142, 1] = 255 img[88,142, 2] = 255 彩色图像:方法二 img[88,142] = [255, 255, 255]
下面代码是获取像素及修改的操作。
代码语言:javascript复制# -*- coding:utf-8 -*-
import cv2
#读取图片
img = cv2.imread("flower.png", cv2.IMREAD_UNCHANGED)
test = img[88,142]
print(test)
img[88,142] = [255, 255, 255]
print(test)
#分别获取BGR通道像素
blue = img[88,142,0]
print(blue)
green = img[88,142,1]
print(green)
red = img[88,142,2]
print(red)
#显示图像
cv2.imshow("Demo", img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
#写入图像
cv2.imwrite("testyxz.jpg", img)
输出结果如下所示:
- [158 107 64]
- [255 255 255]
- 255
- 255
- 255
下面代码是将行为100到200、列150到250的像素区域设置为白色。
代码语言:javascript复制# -*- coding:utf-8 -*-
import cv2
#读取图片
img = cv2.imread("flower.png", cv2.IMREAD_UNCHANGED)
#该区域设置为白色
img[100:200, 150:250] = [255,255,255]
#显示图像
cv2.imshow("Demo", img)
#等待显示
cv2.waitKey(0)
cv2.destroyAllWindows()
#写入图像
cv2.imwrite("testyxz.jpg", img)
运行结果如下图所示:
四.总结
写到这里,这篇毒基础性文章就介绍结束了。希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。本文首发于CSDN专栏,为了帮助更多同学故在公众号同步更新,一起加油!
- 一.图像基础知识
- 二.OpenCV读写图像
- 三.OpenCV像素处理御
参考文献:
- [1] 罗子江. Python中的图像处理[M]. 科学出版社,2020.
- [2] https://blog.csdn.net/eastmount/category_9278090.html
- [3] 冈萨雷斯. 数字图像处理(第3版)[M]. 电子工业出版社,2013.
- [4] 阮秋琦. 数字图像处理学(第3版)[M]. 电子工业出版社,2008.
- [5]毛星云,冷雪飞. OpenCV3编程入门[M]. 电子工业出版社,2015.
- [6]张铮. 数字图像处理与机器视觉——Visual C 与Matlab实现.
- [6]网易云课堂_高登教育. Python OpenCV图像处理