1、灰度化
灰度化,在RGB模型中,如果R=G=B时,则彩色表示一种灰度颜色,其中R=G=B的值叫灰度值,因此,灰度图像每个像素只需一个字节存放灰度值(又称强度值、亮度值),灰度范围为0-255。
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)
效果展示:
学会原理之后,就可以直接尝试更简单直接的办法了
"""
@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()
效果展示:
灰度化:
- 浮点算法:Gray = R0.3 + G0.59 + B0.11
- 整数方法:Gray = (R30 + G59 + B11)/100
- 移位方法:Gray = (R76 + G151 + B*28)>>8
- 平均值法:Gray = (R + G + B)/ 3
- 仅取绿色:Gray = G
自用知识点:
- img.shape[:2]取彩色图片的长、宽
- img.shape[:3]取彩色图片的长、宽、通道
- img.shape[0]图像的垂直尺寸(高度)
- img.shape[1]图像的水平尺寸(宽度)
- img.shape[2]图像的通道数
版权声明:本文为qq_58664081原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。