文章目錄
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()