图像处理之opencv图像美化

1、绘制图片RGB直方图

1.1、彩色图片

1.1.1、cv2.calcHist()方法

  • cv2.calcHist()方法
  • 参数: 1、图片数据; 2、直方图的通道,[0]为灰度; 3、蒙板; 4、分成多少分,256组灰度值;5、直方图中各个像素的值[0.0,255.0]
import cv2
import numpy as np
def ImageHist(image, type):#进行直方图的统计
    color = (255, 255, 255)
    windowName = 'Gray'
    if type == 31:
        color = (255, 0, 0)
        windowName = 'B Hist'
    elif type == 32:
        color = (0, 255, 0)
        windowName = 'G Hist'
    elif type == 33:
        color = (0, 0, 255)
        windowName = 'R Hist'
    # 完成直方图的统计
    # 参数: 1、图片数据; 2、直方图的通道,[0]为灰度; 3、蒙板; 4、分成多少分,256组灰度值;5、直方图中各个像素的值[0.0,255.0]
    hist = cv2.calcHist([image], [0], None, [256], [0.0, 255.0])
    #定义一个最小值,最大值,最小值的下标,最大值的下标
    minV, maxV, minL, maxL = cv2.minMaxLoc(hist)
    histImg = np.zeros([256, 256, 3], np.uint8)
    for h in range(256):
        intenNormal = int(hist[h]*256 / maxV)
        cv2.line(histImg, (h, 256), (h, 256-intenNormal), color)
    cv2.imshow(windowName, histImg)
    return histImg

img = cv2.imread('image.jpg', 1)
#cv2.split()完成图像的分解,把RGB分为R, G, B
channels = cv2.split(img)
#遍历每一种颜色通道
for i in range(0, 3):
    ImageHist(channels[i], 31+i)
    
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

1.1.2、数组法

import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

count_b = np.zeros(256, np.float)
count_g = np.zeros(256, np.float)
count_r = np.zeros(256, np.float)
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        index_b = int(b)        
        index_g = int(g)
        index_r = int(r)
        count_b[index_b] = count_b[index_b] + 1
        count_g[index_g] = count_g[index_g] + 1
        count_r[index_r] = count_r[index_r] + 1
x = np.linspace(0, 255, 256)
y1 = count_b
plt.figure()
plt.bar(x, y1, 0.9, alpha=1, color='b')

y2 = count_g
plt.figure()
plt.bar(x, y2, 0.9, alpha=1, color='g')

y3 = count_r
plt.figure()
plt.bar(x, y3, 0.9, alpha=1, color='r')

plt.show()

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

1.2、灰色图片

  • 本质: 统计每个像素灰度出现的概率,值在 0~255 之间。
import cv2
import numpy as np
img = cv2.imread('damaged.jpg', 1) # 1是读取彩色图片
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

#绘制一个蒙板
paint = np.zeros((height, width, 1), np.uint8)
#绘制一条白色竖线——>(y,x),宽度为3,一个通道
for i in range(100, 200):
    paint[i , 100] = 255
    paint[i , 100+1] = 555
    paint[i , 100-1] = 255
#绘制一条白色横线
for i in range(50, 150):
    paint[150, i] = 255
    paint[150+1, i] = 255
    paint[150-1, i] = 255
cv2.imshow('paint', paint)
# 1、src ;2、mask
imgDst = cv2.inpaint(img, paint, 3, cv2.INPAINT_TELEA)#原图+蒙板

#等待展示并释放资源
cv2.imshow('image', imgDst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2、直方图均衡化

2.1、灰度图片均衡化

import cv2
import numpy as np
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
#灰度处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('Gray', gray)
#均衡化处理
dst = cv2.equalizeHist(gray)
cv2.imshow('dst', dst)
#等待展示并释放资源
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2.2、彩色图片均衡化

import cv2
import numpy as np
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
cv2.imshow('Img', img)

# 分解三通道
(b, g, r) = cv2.split(img)
bH = cv2.equalizeHist(b)
gH = cv2.equalizeHist(g)
rH = cv2.equalizeHist(r)

#合并三通道
result = cv2.merge((bH, gH, rH))

#等待展示并释放资源
cv2.imshow('dst', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

2.3、YUV均衡化

import cv2
import numpy as np
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
cv2.imshow('src', img)
imgYUV = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
#分解第一个通道
channelYUV = cv2.split(imgYUV)
channelYUV[0] = cv2.equalizeHist(channelYUV[0])
channels = cv2.merge(channelYUV)
result = cv2.cvtColor(channels, cv2.COLOR_YCrCb2BGR)
#等待展示并释放资源
cv2.imshow('dst', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

3、图片修补

3.1、图片损坏

  • 在图片中添加一些无关元素,达到图片损坏的目的
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
#绘制一条白色竖线——>(y,x),宽度为3
for i in range(100, 200):
    img[i , 100] = (255, 255, 255)
    img[i , 100+1] = (255, 255, 255)
    img[i , 100-1] = (255, 255, 255)
#绘制一条白色横线
for i in range(50, 150):
    img[150, i] = (255, 255, 255)
    img[150+1, i] = (255, 255, 255)
    img[150-1, i] = (255, 255, 255)
cv2.imwrite('damaged.jpg', img)
#等待展示并释放资源
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

3.2、图片修复

import cv2
import numpy as np
img = cv2.imread('damaged.jpg', 1) # 1是读取彩色图片
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]

#绘制一个蒙板
paint = np.zeros((height, width, 1), np.uint8)
#绘制一条白色竖线——>(y,x),宽度为3,一个通道
for i in range(100, 200):
    paint[i , 100] = 255
    paint[i , 100+1] = 555
    paint[i , 100-1] = 255
#绘制一条白色横线
for i in range(50, 150):
    paint[150, i] = 255
    paint[150+1, i] = 255
    paint[150-1, i] = 255
cv2.imshow('paint', paint)
# 1、src ;2、mask
imgDst = cv2.inpaint(img, paint, 3, cv2.INPAINT_TELEA)#原图+蒙板

#等待展示并释放资源
cv2.imshow('image', imgDst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

4、亮度增强

  • 原理: 在原像素基础上加大某个固定值
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(0, height):
    for j in range(0, width):
        (b, g, r) = img[i, j]
        bb = int(b) + 40
        gg = int(g) + 40
        rr = int(r) + 40
        if bb > 255:
            bb = 255
        if gg > 255:
            gg = 255
        if rr > 255:
            rr = 255
        dst[i, j] = (bb, gg, rr)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

5、磨皮美白

import cv2
img = cv2.imread('face.jpg', 1) # 1是读取彩色图片
cv2.imshow('face', img)
# 双边滤波
dst = cv2.bilateralFilter(img, 15, 35, 35)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

6、高斯滤波

import cv2
import numpy as np
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
cv2.imshow('face', img)
# 高斯滤波
dst = cv2.GaussianBlur(img, (5,5), 1.5)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里插入图片描述

7、均值滤波

  • 均值: 6*6 的模板,权重为1;[ 6 * 6] / 36 = mean 替换 原像素
import cv2
import numpy as np
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst = np.zeros((height, width, 3), np.uint8)
for i in range(3, height-3):
    for j in range(3, width-3):
        sum_b = int(0)
        sum_g = int(0)
        sum_r = int(0)
        for m in range(-3, 3):
            for n in range(-3, 3):
                (b, g, r) = img[i+m, j+n]
                sum_b = sum_b + int(b)
                sum_g = sum_g + int(g)
                sum_r = sum_r + int(r)
        b = np.uint8(sum_b / 36)
        g = np.uint8(sum_g / 36)           
        r = np.uint8(sum_r / 36)
        dst[i, j ] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()          

在这里插入图片描述

8、中值滤波

import cv2
import numpy as np
img = cv2.imread('image.jpg', 1) # 1是读取彩色图片
#获取图片宽高
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow('src', img)
collect = np.zeros(9, np.uint8)
dst = np.zeros((height, width, 3), np.uint8)
for i in range(1, height-1):
    for j in range(1, width-1):
        k = 0
        for m in range(-1, 2):
            for n in range(-1, 2):
                gray = img[i+m, j+n]
                collect[k] = gray
                k = k+1
            #冒泡排序法
        for k in range(0, 9):
            p1 = collect[k]
            for t in range(k+1, 9):
                if p1 < collect[t]:
                    mid = collect[t]
                    p1 = mid
        dst[i, j] = collect[4]
cv2.imshow('dst', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()                      

在这里插入图片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章