Python图像处理入门100题之二值化
前言
这是一个新的专题!
题来自于「画像処理100本ノック」中文版本!为图像处理初学者设计的 100 个问题。
在这里我们可以学到:
1、Python的第三方库OpenCV和matplotlib的基本用法
2、数字图像处理的基本算法
问题三:二值化
把图像进行二值化
二值化是将图像使用黑和白两种颜色表示的方法。
我们将灰度的阈值设置为 128 128 128来进行二值化,即: y = { 0 ( if y < 128 ) 255 ( else ) y= \begin{cases} 0& (\text{if}\quad y < 128) \ 255& (\text{else}) \end{cases} y={0(ify<128) 255(else)
原始图片可以在上面的GitHub链接里找到。
代码实现:
1.准备工作
(1)什么是二值化
我们都知道,图像是由矩阵构成,矩阵中每个点的RGB值都不一样,呈现出来的色彩不一样,最终整体呈现给我们的就是一张彩色的图像。所谓”二值化处理“就是将矩阵中每个点的RGB值变成(0,0,0)[黑色]或者(255,255,255)[白色]。
(2)二值化的意义
早期人们使用计算机处理图像是,实在图像灰度化处理的基础上在进行操作的,但是当时的硬件水平不足,所以处理速度很慢,于是人们引入了图像二值化处理。二值化处理使得原本颜色的取值范围从256种变为2种,确实是提高了计算速度,但是丢失的信息也多了,因此具体采用什么方式处理,要根据具体情况来选择。
2.二值化
代码如下(示例):
import cv2
import numpy as np
# Gray scale
def BGR2GRAY(img):
b = img[:, :, 0].copy()
g = img[:, :, 1].copy()
r = img[:, :, 2].copy()
# Gray scale
out = 0.2126 * r + 0.7152 * g + 0.0722 * b
out = out.astype(np.uint8)
return out
# binalization
def binarization(img, th=128):
img[img < th] = 0
img[img >= th] = 255
return img
# Read image
img = cv2.imread("imori.jpg")
# Grayscale
out = BGR2GRAY(img)
# Binarization
out = binarization(out)
# Save result
cv2.imwrite("out.jpg", out)
cv2.namedWindow("result",0);
cv2.resizeWindow("result", 200, 200);
cv2.imshow("result", out)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果展示:
总结
在本篇博客二值化的方法属于简单阈值法,是在灰度图像的基础上转换的,先进行灰度化处理;设置一个阈值,每个像素大于这个阈值就等于255,小于就等于0,对图像输出就是二值化的图像了。后续的博客我们会介绍更高级的处理方法。
还记得上期博客我们留了一个问题,即
out = 1/3 * b + 1/3 * g + 1/3 * r
out = 1/3 * (b + g + r)
有什么区别。
在python进行数值计算时,遇到除法除不尽的情况或者说小数点后的位数太多时会进行截断处理,因此自然而然上述两个等式的值就是不一样的了,第一个等式做了三次截断操作,而这其中吧,bgr每个分量上又有很多数组,导致最终结果就是两个out的值不等。
第一幅图为第一个等式计算结果,第二幅为第二个等式计算结果,本来以为截断部分很小,对图片输出影像不大,没想到差别还挺大的感兴趣的小伙伴可以去该专栏的上一篇博客自己复制下来代码跑一遍。