圖像處理之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()                      

在這裏插入圖片描述

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