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

一步一步来吧

上一节: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方法的作用是将二维的灰度矩阵展开成一维的灰度向量。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值