一步一步来吧
上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步
1.什么是图像
对于计算机而言,图像的本质是一个由像素点构成的矩阵。
例如我们用肉眼很容易分辨一辆汽车的后视镜。然而对计算机而言,后视镜对应的只是一个矩阵,矩阵的各个元素描述了各像素点的性质(如强度)。
回过头来看我们一开始的代码:
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread(r'D:\0.jpg')
运行后的变量区:
img其实就是一个三维的矩阵(注意左下角的轴,用于切换矩阵的三个维度):
2.图像处理
2.1.胡乱处理
既然图片的本质是矩阵,那么当然可以用对付矩阵的方法对付图片
把矩阵的每个元素都设置为255,即每个像素的值都为白色(255, 255, 255)
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread(r'D:\0.jpg')
img[:][:][:] = 255
cv2.imshow('HelloWorld', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
同理,把矩阵的每个元素都设置为0,便可以得到一张黑色(0, 0, 0)的图像:
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread(r'D:\0.jpg')
img[:][:][:] = 0
cv2.imshow('HelloWorld', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
思考:如果要将一张图像转换为红色呢?
2.2.正经处理
利用cvtColor方法进行颜色空间转换,将图片转化为灰度图像:
# -*- coding: utf-8 -*-
import cv2
img = cv2.imread(r'D:\0.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('HelloWorld', gray_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
此时观察我们处理得到的gray_img:
可以发现,和彩色图像img相比,其只有二维,没有R、G、B这三个彩色通道,只有每个像素点的灰度值。当然,与彩色图像类似,每个像素灰度值为0的图像为黑色图像,灰度值为255则是白色图像。
意义: 在计算机视觉的很多操作(如边缘检测)中,图像的RGB信息是没有价值的,因此我们可以将其去掉来大幅减轻运算量。
2.3.cvtColor的其他用法
除了将彩色图像转化为灰度图外,cvtColor也可以将RGB颜色空间转化为HSV等颜色空间:
- RGB -> HSV:色调(Hue),饱和度(Saturation),明度(Value)
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
HSV空间的视觉直观性要更好,也更适合进行掩膜(例如将一张照片中的蓝色区域判定成车牌)等操作。
2.4.图像大小调整
在图像处理的时候,图片尺寸不能太大,否则会影响处理的性能。
利用resize方法来调整图像的尺寸。例如:
img = cv2.resize(img, (100, 100))
这样我们就可以将原大小为200 × 200的图片缩小为100 × 100。
当然要放大也是可以的:
img = cv2.resize(img, (400, 400), interpolation = cv2.INTER_CUBIC)
注意这个时候多了一个interpolation参数,其用于指定图像变化时所用的插值方法。常用的方法有:
- cv2.INTER_NEAREST:最近邻插值
- cv2.INTER_LINEAR:双线性插值,适合放大图片,快,默认方法
- cv2.INTER_CUBIC:立方插值,适合放大图片,与线性插值相比稍慢
- cv2.INTER_AREA:局部像素重采样,适合缩小图片
3.灰度直方图
图像直方图(histogram)是图像的统计学特征,常用于了解图像的基本特征以便分析。
实际上就是把图像转化成灰度图像,统计各个像素点的灰度值,绘制得到的直方图,其横轴是灰度值[0,255],纵轴是该灰度值所对应的像素的数目。对灰度直方图做积分得到的结果是图像的像素数。
由于我们使用的图片颜色比较简单(几乎只有红黄白三色。。。),因此它的灰度直方图长这样:
从图中也能明显看出图片以白色的背景为主(灰度集中在250+)。
# -*- coding: utf-8 -*-
import cv2
import matplotlib.pyplot as plt
def plt_hist(img):
plt.hist(img.ravel(), 256, [0, 256])
plt.show()
img = cv2.imread(r'D:\0.jpg')
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
plt_hist(gray_img)
其中ravel方法的作用是将二维的灰度矩阵展开成一维的灰度向量。