【Python】彩色图像的灰度化、二值化

1、灰度化

灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。

【Python】彩色图像的灰度化、二值化_第1张图片

2、二值化

二值化,就是将图像上的像素点的灰度值设置为0或255,也就是将整个图像呈现出明显的只有黑和白的视觉效果。

"""
@author: 绯雨千叶

彩色图像的灰度化、二值化
"""
import numpy as np
import matplotlib.pyplot as plt
import cv2

# 灰度化实现方式(原理)
# cv中读取颜色为BGR而不是主流的RBG,大坑
img1 = cv2.imread("../img/lrn.jpg")
h, w = img1.shape[:2]  # 获取图片的高、宽
img2 = np.zeros([h, w], img1.dtype)  # 创建一张和当前图片大小一样的单通道图片
for i in range(h):
    for j in range(w):
        # 取出当前high和wide中的BGR坐标
        m = img1[i, j]
        # 将BGR坐标转化gray坐标并赋值给新图像
        # 浮点算法:Gray = R0.3 + G0.59 + B0.11
        img2[i, j] = int(m[0] * 0.11 + m[1] * 0.59 + m[2] * 0.3)
# print("原图三色通道显示:%s" % img1)
# print("灰度图单色通道显示:%s" % img2)
cv2.imshow("image show gray", img2)
cv2.imshow("image", img1)

# 二值化实现方式(原理)
img3 = np.zeros([h, w], img1.dtype)
for i in range(h):
    for j in range(w):
        if img2[i, j] <= 128:
            img3[i, j] = 0
        else:
            img3[i, j] = 1
# cv2.imshow()没办法把二值图正常展示出来,需要用到plt
plt.imshow(img3, cmap='gray')  # cmap表示二值是哪二值gray为黑白
plt.show()
cv2.waitKey(0)

 效果展示: 

【Python】彩色图像的灰度化、二值化_第2张图片


学会原理之后,就可以直接尝试更简单直接的办法了

"""
@author: 绯雨千叶

彩色图像的灰度化、二值化
"""
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pyplot as plt

img1 = plt.imread("../img/lrn.jpg")
plt.subplot(221)  # 将整个图像窗口分为2行2列, 当前位置为1
plt.imshow(img1)

# 灰度化
img2 = rgb2gray(img1)
plt.subplot(222)
plt.imshow(img2, cmap='gray')

# 二值化
img3 = np.where(img2 >= 0.5, 1, 0)  # 是的话是1,否则为0
plt.subplot(223)
plt.imshow(img3, cmap='gray')

plt.show()

效果展示: 

【Python】彩色图像的灰度化、二值化_第3张图片


灰度化:

  1. 浮点算法:Gray = R0.3 + G0.59 + B0.11
  2. 整数方法:Gray = (R30 + G59 + B11)/100
  3. 移位方法:Gray = (R76 + G151 + B*28)>>8
  4. 平均值法:Gray = (R + G + B)/ 3
  5. 仅取绿色:Gray = G

自用知识点:

  • img.shape[:2]取彩色图片的长、宽
  • img.shape[:3]取彩色图片的长、宽、通道
  • img.shape[0]图像的垂直尺寸(高度)
  • img.shape[1]图像的水平尺寸(宽度)
  • img.shape[2]图像的通道数

【Python】彩色图像的灰度化、二值化_第4张图片

你可能感兴趣的:(人工智能,python,计算机视觉,深度学习,opencv,图像处理)