我们日常的环境通常获得的是彩色图像,很多时候我们常常需要将彩色图像转换成灰度图像。也就是3个通道(RGB)转换成1个通道。
(1)平均法
最简单的方法当然就是平均法,将同一个像素位置3个通道RGB的值进行平均。
I(x,y)=1/3∗IR(x,y)+1/3∗IG(x,y)+1/3∗IB(x,y)
原始图像:
import cv2
import numpy as np
lenna = cv2
.imread(
"lenna.png")
row, col, channel = lenna
.shape
lenna_gray = np
.zeros((row, col))
for r
in range(row):
for l
in range(col):
lenna_gray[r, l] =
1 /
3 * lenna[r, l,
0] +
1 /
3 * lenna[r, l,
1] +
1 /
3 * lenna[r, l,
2]
cv2
.imshow(
"lenna_gray", lenna_gray
.astype(
"uint8"))
cv2
.waitKey()
(2)最大最小平均法
取同一个像素位置的RGB中亮度最大的和最小的进行平均。
I(x,y)=0.5∗max(IR(x,y),IG(x,y),IB(x,y))+0.5∗min(IR(x,y),IG(x,y),IB(x,y))
for r
in range(row):
for l
in range(col):
lenna_gray[r, l] =
1 /
2 *
max(lenna[r, l,
0], lenna[r, l,
1], lenna[r, l,
2]) +
1 /
2 *
min(lenna[r, l,
0], lenna[r, l,
1], lenna[r, l,
2])
cv2.imshow(
"lenna_maxmin", lenna_gray.astype(
"uint8"))
cv2.waitKey()
(3)加权平均法
I(x,y)=0.3∗IR(x,y)+0.59∗IG(x,y)+0.11∗IB(x,y)
这是最流行的方法。几个加权系数0.3,0.59,0.11是根据人的亮度感知系统调节出来的参数,是个广泛使用的标准化参数。
for r
in range(row):
for l
in range(col):
lenna_gray[r, l] =
0.11 * lenna[r, l,
0] +
0.59 * lenna[r, l,
1] +
0.3 * lenna[r, l,
2]
cv2.imshow(
"lenna_weighted", lenna_gray.astype(
"uint8"))
cv2.waitKey()
(4)二值图像
不严谨的时候,我们也可以把灰度图称为黑白图像,实际上除了灰度图,还有一种图像叫二值图,也就是灰度只有0和255,这才是“真正的黑白图像”,因为0代表黑色,255代表白色。我们设定一个阈值T,当某像素点的灰度值大于T时,设定该像素点的值为255,当小于T时,设定为0。
lenna_binary = np.zeros_like(lenna_gray)
threshold =
100
for r
in range(row):
for l
in range(col):
if lenna_gray[r, l] >= threshold:
lenna_binary[r, l] =
255
else:
lenna_binary[r, l] =
0
cv2.imshow(
"lenna_binary", lenna_binary.astype(
"uint8"))
cv2.waitKey()
(5)反转图像
反转图像也很简单:s = 255-r。反转图像特别适用于增强暗色图像中的白色或灰色细节。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
x_ray = cv2
.imread(
"x_ray.png",
0)
row, col = x_ray
.shape
x_ray_inverse = np
.zeros_like(x_ray)
for r
in range(row):
for l
in range(col):
x_ray_inverse[r, l] =
255 - x_ray[r, l]
cv2
.imshow(
"x_ray", x_ray)
cv2
.imshow(
"x_ray_inverse", x_ray_inverse)
cv2
.waitKey()
转载自:https://blog.csdn.net/saltriver/article/details/79677116