项目场景:
今天我们开始最基础的图像处理,将一张图片进行灰度化处理。我们将使用OpenCV来进行图像的处理
基础知识
图片主要包含以下内容:
1.像素,也就是我们通常说的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 npimport matplotlib.pyplot as pltimport cv2# 灰度化img = cv2.imread("lenna.png")h, w = img.shape[:2] # 获取图片的high和wideimg_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.所以在做二值化的时候无需除以255img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 因为imread读进来的是BGR数据,所以这里做BGR转GRAY# 二值化img_binary = np.where(img_gray/255 >= 0.5, 1, 0)