1500字范文,内容丰富有趣,写作好帮手!
1500字范文 > Python+Opencv图像处理新手入门教程(二):颜色空间转换 图像大小调整 灰度直方图

Python+Opencv图像处理新手入门教程(二):颜色空间转换 图像大小调整 灰度直方图

时间:2021-02-12 03:01:22

相关推荐

Python+Opencv图像处理新手入门教程(二):颜色空间转换 图像大小调整 灰度直方图

一步一步来吧

上一节:Python+Opencv图像处理新手入门教程(一):介绍,安装与起步

1.什么是图像

对于计算机而言,图像的本质是一个由像素点构成的矩阵。

例如我们用肉眼很容易分辨一辆汽车的后视镜。然而对计算机而言,后视镜对应的只是一个矩阵,矩阵的各个元素描述了各像素点的性质(如强度)。

回过头来看我们一开始的代码:

# -*- coding: utf-8 -*-import cv2img = cv2.imread(r'D:\0.jpg')

运行后的变量区:

img其实就是一个三维的矩阵(注意左下角的,用于切换矩阵的三个维度):

2.图像处理

2.1.胡乱处理

既然图片的本质是矩阵,那么当然可以用对付矩阵的方法对付图片

把矩阵的每个元素都设置为255,即每个像素的值都为白色(255, 255, 255)

# -*- coding: utf-8 -*-import cv2img = cv2.imread(r'D:\0.jpg')img[:][:][:] = 255cv2.imshow('HelloWorld', img)cv2.waitKey(0)cv2.destroyAllWindows()

同理,把矩阵的每个元素都设置为0,便可以得到一张黑色(0, 0, 0)的图像:

# -*- coding: utf-8 -*-import cv2img = cv2.imread(r'D:\0.jpg')img[:][:][:] = 0cv2.imshow('HelloWorld', img)cv2.waitKey(0)cv2.destroyAllWindows()

思考:如果要将一张图像转换为红色呢?

2.2.正经处理

利用cvtColor方法进行颜色空间转换,将图片转化为灰度图像:

# -*- coding: utf-8 -*-import cv2img = 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 cv2import matplotlib.pyplot as pltdef 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方法的作用是将二维的灰度矩阵展开成一维的灰度向量。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。