??所有颜色都是由
R
R
R(红)、
G
G
G(绿)、
B
B
B(蓝) 3个单色调配而成, 每种单色都人为地从
0
~
255
0~255
0~255分成了
256
256
256个级,所以根据
R
R
R、
G
G
G、
B
B
B的不同 组合可以表示
256
×
256
×
256
=
16777216
256×256×256=16777216
256×256×256=16777216种颜色,被称为全彩色图像(full-color image)或者真彩色图像(true-color image)。一幅全彩色图像如果不压缩,文件将会很大。例如,一幅
640
×
480
640×480
640×480像素的全彩色图像,一个像素由
3
3
3个字节来表示
R
R
R、
G
G
G、
B
B
B各个分量,需要保存
640
×
480
×
3
=
921600
640×480×3=921600
640×480×3=921600(约1MB)字节。 ??对于自然界的目标提取,可以根据目标的颜色特征,尽量使用
R
R
R、
G
G
G、
B
B
B分量及它们之间的差分组合,这样可以有效避免自然光变化的影响,快速有效地提取目标。 ??举例:要从果树上提取桃子的红色区域所在位置,如下面照片所示。 由于成熟桃子一般带红色,因此对彩色原图像首先利用红、绿色差信息提取图像中桃子的红色区域。对图像中的像素点(
x
i
x_i
xi?,
y
i
y_i
yi?)(
x
i
x_i
xi?、
y
i
y_i
yi?分别为像素点
i
i
i的
x
x
x坐标和
y
y
y坐标,
0
≤
i
<
n
0≤i<n
0≤i<n,
n
n
n为图像中像素点的总数),设其红色(
R
R
R)分量和绿色(
G
G
G)分量的像素值分别为
R
R
R(
x
i
x_i
xi?,
y
i
y_i
yi?)和
G
G
G(
x
i
x_i
xi?,
y
i
y_i
yi?),其差值为
β
i
β_i
βi?=
R
R
R(
x
i
x_i
xi?,
y
i
y_i
yi?)
?
-
?
G
G
G(
x
i
x_i
xi?,
y
i
y_i
yi?),由此获得一个灰度图像(
R
G
RG
RG图像), 若
β
i
>
0
β_i>0
βi?>0,设灰度图像上该点的像素值为βi,否则为0(黑色)。之后做出
R
G
RG
RG图像的直方图找出谷点
α
α
α(作为二值化的阈值)。逐像素扫描
R
G
RG
RG图像,若
β
i
>
α
β_i>α
βi?>α,则将该点像素值设为
255
255
255(白色),否则设为
0
0
0(黑色),获得二值图像。然后再对图像进行形态学处理。 色差图: 直方图: 二值化: 形态学处理:
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('peach.jpg', 1)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
r, g, b = cv2.split(img_rgb)
c = r - g
hist, bins = np.histogram(c, bins = 256, range = (0, 256))
plt.plot(hist)
plt.show()
thresh_value = np.sum(c[np.where(c != 0)]) / np.sum(c != 0)
_, peach = cv2.threshold(c, 190, 255, cv2.THRESH_BINARY_INV)
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (3, 3))
peach = cv2.erode(peach, kernel, iterations = 3)
|