图片美化

亮度增强

亮度增强,其实就是将每个颜色值增大一点点 例如: color = color + 50 即可调亮图片 color = color - 50 即可调暗图片

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import cv2 as cv

def checkColor(value):
    value = value if value < 256 else 255
    value = value if value > 0 else 0
    return value

# 将图片数据读取进来
img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)
cv.imshow('img',img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

# 定义颜色改变的值
count=35

# 遍历每一个像素点
for row in range(height):
    for col in range(width):
        # 获取每个像素点的颜色值
        (b,g,r) = img[row,col]
        #  增大当前颜色值
        newb = b + count
        newg = g + count
        newr = r + count

        # 校验每个像素值不能越界
        newb = checkColor(newb)
        newg = checkColor(newg)
        newr = checkColor(newr)

        img[row,col] = (newb,newg,newr)
# 显示改变之后的图像
cv.imshow('newimg',img)
cv.waitKey(0)

灰度图片

直方图

统计每个灰度值出现的概率

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 将图片数据读取进来
img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 将图片转成灰度图片
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)

# 定义一个向量,用于记录每个灰度出现的次数
count = np.zeros(256,np.float)

# 统计每一个灰度出现的次数
for row in range(height):
    for col in range(width):
        # 获取每个像素的灰度值
        gray = int(grayImg[row,col])
        # 统计
        count[gray]=count[gray]+1

# 统计出现的概率
# 定义一个向量,用于记录每个灰度出现的次数
ratios = np.zeros(256,np.float)
for i in range(256):
    # 将次数转成概率
    ratios[i] = count[i]/(height*width)

x = np.linspace(0,255,256)
y = ratios

plt.bar(x,y,0.9,color='gray')
plt.show()

cv.waitKey(0)

直方图-api

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 将图片数据读取进来
img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)

# 将图片转成灰度图片
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("gray",grayImg)


# 计算直方图 , 注意这里需要用数组的方式传值
hist = cv.calcHist([grayImg],[0],None,[256],[0.0,255.0])
plt.plot(hist,color="green")
plt.show()


cv.waitKey(0)
cv.destroyAllWindows()

备注: 使用matplotlib绘制直方图有两种方式

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
方式一:
    # 使用api将直方图数据计算好 图片 通道  掩膜  数量  值的范围
    hist = cv.calcHist([grayImg],[0],None,[256],[0.0,255.0])
    # 调用plot函数显示
    plt.plot(hist,color="green")
    plt.show()
方式二:
    # 1.使用Img.ravel()将多行的矩阵转成单行的矩阵
    # 2. 然后调用matplot的hist函数自动计算直方图,bins表示像素区间数量
    plt.hist(grayImg.ravel(),color="red",bins=256)
    plt.show()

直方图均衡化

直方图均衡化是将原图象的直方图通过变换函数修正为均匀的直方图,然后按均衡直方图修正原图象。图象均衡化处理后,图象的直方图是平直的,即各灰度级具有相同的出现频数,那么由于灰度级具有均匀的概率分布,图象看起来就更清晰了。

经过直方图均衡化处理之后,我们整个图像的颜色变化就是一种平滑变化的状态

原始直方图 -- 均衡化直方图的 变换函数 : 累积概率图

下面我们来看一下灰色图片经过直方图均衡化处理之后的对比

这里是均衡化前后图像直方图的对比

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 将图片数据读取进来
img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
# 将图片转成灰度图片
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
# 显示灰度图片
cv.imshow('grayimg',grayImg)
# 定义一个向量,用于记录每个灰度出现的次数
count = np.zeros(256,np.float)

# 统计每一个灰度出现的次数
for row in range(height):
    for col in range(width):
        # 获取每个像素的灰度值
        gray = int(grayImg[row,col])
        # 统计
        count[gray]=count[gray]+1

# 统计出现的概率
# 定义一个向量,用于记录每个灰度出现的次数
ratios = np.zeros(256,np.float)
for i in range(256):
    # 将次数转成概率
    ratios[i] = count[i]/(height*width)

x = np.linspace(0,255,256)
y = ratios

plt.bar(x,y,0.9,color='gray')
plt.show()

# 定义累计概率初值
sum1 = 0.0
# 定义用于记录累计概率的数组
sumRatios = np.zeros(256,np.float)
# 计算每个灰度的累计概率
for i in range(256):
    sum1 = sum1 + ratios[i]
    sumRatios[i]=sum1

x = np.linspace(0,255,256)
y = sumRatios

# 显示均衡化之后的直方图
plt.bar(x,y,0.9,color='green')
plt.show()

# 遍历原灰图
for row in range(height):
    for col in range(width):
        # 取出原灰度
        gray = grayImg[row,col]
        # 取出当前灰度的累计概率
        ratio = sumRatios[gray]
        # 计算新的灰度,并赋值
        grayImg[row,col]=np.uint8(255*ratio)


cv.imshow('new gray img',grayImg)

# 会自己去统计直方图
plt.hist(grayImg.ravel(),color="red",bins=256)
plt.show()

cv.waitKey(0)

直方图均衡化-api

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import cv2 as cv
import numpy as np
import matplotlib.pyplot as plt

# 将图片数据读取进来
img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)

# 将图片转成灰度图片
grayImg = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
cv.imshow("gray",grayImg)


# 计算直方图 , 注意这里需要用数组的方式传值
hist = cv.calcHist([grayImg],[0],None,[256],[0.0,255.0])
plt.plot(hist,color="green")
plt.show()

# 直方图均衡化
# equalize_img = np.zeros(grayImg.shape,np.uint8)
equalize_img = cv.equalizeHist(grayImg)
cv.imshow("equalize img",equalize_img)

# 会自己统计直方图,但是需要将多行数据转成单行数据
plt.hist(equalize_img.ravel(),bins=256)
plt.show()

cv.waitKey(0)
cv.destroyAllWindows()

彩色图片

直方图

在前面,我们计算灰度图片的直方图时,我们只需要统计灰色值出现的概率就可以了,现在我们要处理的是彩色图片,所以我们需要将(B,G,R)三种颜色值取出来,单独计算每种颜色的直方图

代码实现

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
import cv2 as cv
import matplotlib.pyplot as plt

img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)

colors = ["blue","green","red"]
img_split = cv.split(img)
for i,channel in enumerate(img_split):
    plt.hist(channel.ravel(),bins=256,color=colors[i])
    plt.show()

cv.waitKey(0)
cv.destroyAllWindows()

直方图均衡化

示例代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import cv2 as cv

img = cv.imread("img/itheima.jpg",cv.IMREAD_COLOR)

b,g,r = cv.split(img)

b_dst = cv.equalizeHist(b)
g_dst = cv.equalizeHist(g)
r_dst = cv.equalizeHist(r)

ret = cv.merge([b_dst,g_dst,r_dst])

# 显示均衡化之后的图片
cv.imshow("src",img)
cv.imshow("equalize_img",ret)

cv.waitKey(0)
cv.destroyAllWindows()