项目场景:

今天我们开始最基础的图像处理,将一张图片进行灰度化处理。我们将使用OpenCV来进行图像的处理


基础知识

图片主要包含以下内容:
1.像素,也就是我们通常说的RGB模型,红、绿、蓝组成。
RGB颜色模型是三维直角坐标系下的一个单位正方体!
RGB模型
也就是说,图片中的某个像素点的取值为(x,y,z)。

2.分辨率,也就是图像的解析度,单位英寸内的像素点数
3.灰度,表示图像像素的明暗程度的数值,也就是黑白图像中点的颜色深度。范围一般为0-255。白色为255,黑色为0.

图片灰度化

我们要做的是将图片灰度化,那么首先就要搞清楚,什么是灰度化?
所谓灰度,就是图像没有色彩。举个例子,原本的彩色图片是有RGB三种颜色组成的(也就是每个像素点由三个值),现在给图像灰度化,每个像素点只有一个值(0-255)表示颜色的深度。
大家也可以这样理解:彩色图片,颜色是在一个三维坐标下(也就是RGB模型)确定的,而灰度图的坐标是在一维坐标下确定的,取值范围为0-255.

图片灰度化的方法(也就是颜色由三维表示转一维表示的方法)

灰度化:
在这里插入图片描述
二值化:我们在上诉的灰度化中,颜色以经由三维变成了一维的(取值范围0-255),当这个取值只能为0或者1的时候,便是图像二值化。(当然,这两个值不仅限于0和1,也可以是其他的两个值)

代码展示

import numpy as np
import matplotlib.pyplot as plt
import cv2

# 灰度化
img = cv2.imread("lenna.png")
h, w = img.shape[:2]  # 获取图片的high和wide
img_gray = np.zeros([h, w], img.dtype)  # 创建一张和当前图片大小一样的单通道图片
for i in range(h):
    for j in range(w):
        m = img[i, j]  # 取出当前high和wide中的BGR坐标
        img_gray[i, j] = int(m[0] * 0.11 + m[1] * 0.59 + m[2] * 0.3)  # 将BGR坐标转化为gray坐标并赋值给新图像
print(img_gray[2,1])
# 二值化
img_binary = np.where(img_gray/255 >= 0.5, 1, 0)

# 画图
img = plt.imread("lenna.png")
plt.subplot(221)
plt.imshow(img)
plt.title('Color map')

plt.subplot(222)
plt.imshow(img_gray, cmap='gray')
plt.title('gray')

plt.subplot(223)
plt.imshow(img_binary, cmap='gray')
plt.title('img_binary')
plt.savefig('mytestplt.png')
plt.show()

效果展示:

在这里插入图片描述

写在最后:

当然,我们在使用第三方库的时候,这种简单的事情根本不需要我们来做,直接调用第三方库的接口即可,哈哈!

# 灰度化
#img_gray = rgb2gray(img) # 此函数做灰度化,返回的数值范围为0-1.所以在做二值化的时候无需除以255
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 因为imread读进来的是BGR数据,所以这里做BGR转GRAY

# 二值化
img_binary = np.where(img_gray/255 >= 0.5, 1, 0) 

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐