本文分享自华为云社区《[Python图像处理] 一.图像处理基础知识及OpenCV入门函数》,作者: eastmount。
一.图像基础知识
图像都是由像素(pixel)构成的,即图像中的小方格,这些小方格都有一个明确的位置和被分配的色彩数值,而这些一小方格的颜色和位置就决定该图像所呈现出来的样子。像素是图像中的最小单位,每一个点阵图像包含了一定量的像素,这些像素决定图像在屏幕上所呈现的大小。
![v2-7651e9a6b1ee43448fb731a81ce062fe_720w.jpg v2-7651e9a6b1ee43448fb731a81ce062fe_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535bnn3179111155x3t.jpg)
图像通常包括二值图像、灰度图像和彩色图像。
![v2-e4f1249cedf54cb0021c6e9ffa5a3aa2_720w.jpg v2-e4f1249cedf54cb0021c6e9ffa5a3aa2_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535ornrg77knk3kagd0.jpg)
1.二值图像
二值图像中任何一个点非黑即白,要么为白色(像素为255),要么为黑色(像素为0)。将灰度图像转换为二值图像的过程,常通过依次遍历判断实现,如果像素>=127则设置为255,否则设置为0。
![v2-2bf653f4f97a59ab45c70fa14cfa24bf_720w.jpg v2-2bf653f4f97a59ab45c70fa14cfa24bf_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535ldodla4m5terkc4a.jpg)
2.灰度图像
灰度图像除了黑和白,还有灰色,它把灰度划分为256个不同的颜色,图像看着也更为清晰。将彩色图像转换为灰度图是图像处理的最基本预处理操作,通常包括下面几种方法:
(1) 浮点算法:Gray=R0.3+G0.59+B0.11
(2) 整数方法:Gray=(R30+G59+B11)/100
(3) 移位方法:Gray=(R28+G151+B77)>>8;
(4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
(5) 仅取绿色:Gray=G;
(6) 加权平均值算法:根据光的亮度特性,公式: R=G=B=R0.299+G*0.587+B0.144
(2) 整数方法:Gray=(R30+G59+B11)/100
(3) 移位方法:Gray=(R28+G151+B77)>>8;
(4) 平均值法:Gray=(R+G+B)/3;(此程序采用算法)
(5) 仅取绿色:Gray=G;
(6) 加权平均值算法:根据光的亮度特性,公式: 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值,来达到彩色图转变为灰度图。
![v2-95f6c09c867225c56e37294426bdf0de_720w.jpg v2-95f6c09c867225c56e37294426bdf0de_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535ciiicknk4fzs9sn5.jpg)
3.彩色图像
彩色图像是RGB图像,RGB表示红、绿、蓝三原色,计算机里所有颜色都是三原色不同比例组成的,即三色通道。
![v2-91527cfcf9d786d18e58c02de0c8a557_720w.jpg v2-91527cfcf9d786d18e58c02de0c8a557_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535gixgzbwtvgiavi2x.jpg)
二.OpenCV读写图像
本文主要使用Python2.7和OpenCV进行讲解,首先调用"pip install opencv-python"安装OpenCV库,如下图所示:
![v2-92096118e302494016cc325507e6a389_720w.jpg v2-92096118e302494016cc325507e6a389_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535v9hqg0sqygss4gq4.jpg)
1.读入图像
OpenCV读图像主要调用下面函数实现:
img = cv2.imread(文件名,[,参数])参数(1) cv2.IMREAD_UNCHANGED (图像不可变) 参数(2) cv2.IMREAD_GRAYSCALE (灰度图像) 参数(3) cv2.IMREAD_COLOR (读入彩色图像) 参数(4) cv2.COLOR_BGR2RGB (图像通道BGR转成RGB)
复制代码显示图像调用函数如下:
cv2.imshow(窗口名, 图像名)
复制代码调用函数如下:
cv2.waitKey(delay
复制代码4.删除所有窗口
调用函数如下:
cv2.destroyAllWindows() 删除所有窗口cv2.destroyWindows() 删除指定的窗口
复制代码调用函数如下:
retval = cv2.imwrite(文件地址, 文件名)
复制代码下面代码是读入图片并显示保存。
# -*- coding:utf-8 -*-import cv2 #读取图片 img = cv2.imread("test.jpg") #显示图像 cv2.imshow("Demo", img) #等待显示 cv2.waitKey(0) cv2.destroyAllWindows() #写入图像 cv2.imwrite("testyxz.jpg", img)
复制代码输出结果如下图所示,并且在文件夹下保存了一张名为“testyxz.jpg”的图像。
![v2-b9011b00e5455006757bf463ee24c206_720w.jpg v2-b9011b00e5455006757bf463ee24c206_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535dhgo0d65z6k755lg.jpg)
如果代码中没有watiKey(0)函数,则运行结果如下图所示:
![v2-683491bced88cb325d6762c6478a2561_720w.jpg v2-683491bced88cb325d6762c6478a2561_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535mgfgd90fjnje7a6j.jpg)
同时,可以对代码进行升级,如下所示:
#无限期等待输入k=cv2.waitKey(0) #如果输入ESC退出 if k==27: cv2.destroyAllWindows()
复制代码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]
复制代码下面代码是获取像素及修改的操作。
# -*- coding:utf-8 -*-import cv2 #读取图片 img = cv2.imread("test.jpg", 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的像素区域设置为白色。
# -*- coding:utf-8 -*-import cv2 #读取图片 img = cv2.imread("test.jpg", 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)
复制代码![v2-48f1749bd52319c05f2323727e7c8969_720w.jpg v2-48f1749bd52319c05f2323727e7c8969_720w.jpg](https://static.assets-stash.eet-china.com/forum/202205/07/112535kddkdiiud1iklud5.jpg)
希望文章对大家有所帮助,如果有错误或不足之处,还请海涵。再次感谢您的关注,初来在华为云社区分享知识,初来乍到,还请多多指教。
本文摘录自eastmount X华为云开发者社区联合出品的电子书《从零到一 • Python图像处理及识别》。