二值图像
二值图像(Binary Image),按名字来理解只有两个值,0和1,0代表黑,1代表白,或者说0表示背景,而1表示前景。其保存也相对简单,每个像素只需要1Bit就可以完整存储信息。如果把每个像素看成随机变量,一共有N个像素,那么二值图有2的N次方种变化,而8位灰度图有255的N次方种变化,8为三通道RGB图像有255*255*255的N次方种变化。也就是说同样尺寸的图像,二值图保存的信息更少。二值图像(binary image),即图像上的每一个像素只有两种可能的取值或灰度等级状态,人们经常用黑白、B&W、单色图像表示二值图像。
灰度图像
灰度图像是二值图像的进化版本,是彩色图像的退化版,也就是灰度图保存的信息没有彩色图像多,但比二值图像多,灰度图只包含一个通道的信息,而彩色图通常包含三个通道的信息,单一通道的理解可以理解为单一波长的电磁波,所以,红外遥感,X断层成像等单一通道电磁波产生的图像都为灰度图,而且在实际中灰度图易于采集和传输等性质的存在导致基于灰度图像开发的算法非常丰富。
灰度图像(gray image)是每个像素只有一个采样颜色的图像,这类图像通常显示为从最暗黑色到最亮的白色的灰度,尽管理论上这个采样可以任何颜色的不同深浅,甚至可以是不同亮度上的不同颜色。灰度图像与黑白图像不同,在计算机图像领域中黑白图像只有黑色与白色两种颜色;但是,灰度图像在黑色与白色之间还有许多级的颜色深度。灰度图像经常是在单个电磁波频谱如可见光内测量每个像素的亮度得到的,用于显示的灰度图像通常用每个采样像素8位的非线性尺度来保存,这样可以有256级灰度(如果用16位,则有65536级)。
彩色图像
彩色图像,每个像素通常是由红(R)、绿(G)、蓝(B)三个分量来表示的,分量介于(0,255)。
彩色图像的灰度化、二值化
·
# -*- coding: utf-8 -*-
"""
@author: tz_zs
彩色图像的灰度化、二值化
"""
from skimage import io
from skimage.color import rgb2gray
import numpy as np
import matplotlib.pyplot as plt
img = io.imread("53788-106.jpg") # (1080, 1920, 3)
io.imshow(img)
io.show()
print(img)
'''
[[[255 255 255]
[255 255 255]
[255 255 255]
...,
[217 224 234]
[217 224 234]
[217 224 234]]
...,
[[188 165 131]
[195 175 140]
[186 166 131]
...,
[163 138 108]
[156 131 101]
[153 128 98]]]
'''
# 灰度化
img_gray = rgb2gray(img) # (1080, 1920)
io.imshow(img_gray)
io.show()
print(img_gray)
'''
[[ 1. 1. 1. ..., 0.87542549 0.87542549
0.87542549]
[ 1. 1. 1. ..., 0.85973922 0.85973922
0.85973922]
[ 1. 1. 1. ..., 0.86366078 0.86366078
0.86366078]
...,
[ 0.64347137 0.6277851 0.71405961 ..., 0.66333137 0.67901765
0.7103902 ]
[ 0.57931961 0.62637843 0.70286039 ..., 0.6594098 0.62411569
0.60450784]
[ 0.65661216 0.6930451 0.65775098 ..., 0.55352745 0.52607647
0.51431176]]
'''
# 二值化
# rows, cols = img_gray.shape
# for i in range(rows):
# for j in range(cols):
# if (img_gray[i, j] <= 0.5):
# img_gray[i, j] = 0
# else:
# img_gray[i, j] = 1
img_binary = np.where(img_gray >= 0.5, 1, 0) # (1080, 1920)
print(img_binary)
'''
[[1 1 1 ..., 1 1 1]
[1 1 1 ..., 1 1 1]
[1 1 1 ..., 1 1 1]
...,
[1 1 1 ..., 1 1 1]
[1 1 1 ..., 1 1 1]
[1 1 1 ..., 1 1 1]]
'''
io.imshow(img_binary)
io.show()
# plt.imshow(img_binary)
# plt.show()
·
·
灰度图的显示
·
# -*- coding: utf-8 -*-
"""
@author: tz_zs
灰度图的显示情况
"""
import numpy as np
import matplotlib.pyplot as plt
from PIL import Image
'''
img = Image.open('53788-106.jpg')
print(img) # <PIL.JpegImagePlugin.JpegImageFile image mode=RGB size=1920x1080 at 0x16BECF00898>
img = np.array(img)
'''
img = plt.imread('53788-106.jpg')
print(img)
'''
[[[255 255 255]
[255 255 255]
[255 255 255]
...,
...,
[163 138 108]
[156 131 101]
[153 128 98]]]
'''
plt.figure(1) # 第一个figure
plt.imshow(img)
if img.ndim == 3:
img = img[:, :, 0]
print(img)
'''
[[255 255 255 ..., 217 217 217]
[255 255 255 ..., 213 213 213]
[255 255 255 ..., 214 214 214]
...,
[181 177 199 ..., 191 195 203]
[166 178 196 ..., 190 181 176]
[188 195 186 ..., 163 156 153]]
'''
plt.figure(2) # 第二个figure
plt.subplot(221)
plt.imshow(img) # 一般显示的情况下,显示为热力图
plt.subplot(222)
plt.imshow(img, cmap='gray') # 灰度图正确的表示方法1
plt.subplot(223)
plt.imshow(img, cmap=plt.cm.gray) # 灰度图正确的表示方法2
plt.subplot(224)
plt.imshow(img, cmap=plt.cm.gray_r) # 黑白反转
plt.show()
·
很多图片识别为什么将彩色图像灰度化?
https://www.zhihu.com/question/24453478
截取:
我们识别物体,最关键的因素是梯度(现在很多的特征提取,SIFT,HOG等等本质都是梯度的统计信息),梯度意味着边缘,这是最本质的部分,而计算梯度,自然就用到灰度图像了。颜色本身,非常容易受到光照等因素的影响,同类的物体颜色有很多变化。所以颜色本身难以提供关键信息。
大多数的医学图像RGB提供的信息量很少(几乎没有),所以可以直接灰度图像来进行后续计算。在这些问题上,反而对灰度图像预处理更重要(当然,CNN发展以后这些预处理作用也小了)。
灰度化之后颜色信息丢失,很多color-based算法就不可能这么做,但是很多简单的识别算法对于颜色的依赖性不强,hand-craft特征更多关注边缘梯度信息。工程中很多应用加上color信息之后鲁棒性会下降。灰度化之后矩阵维数下降,运算速度大幅度提高,并且梯度信息仍然保留。
原文链接:https://blog.csdn.net/tz_zs/java/article/details/79768201