歡迎關注『快速學完OpenCV+python計算機視覺影像處理 @滿目星辰wwq』 系列,持續更新
快速學完OpenCV+python計算機視覺影像處理(一)
快速學完OpenCV+python計算機視覺影像處理(二)
快速學完OpenCV+python計算機視覺影像處理(三)
快速學完OpenCV+python計算機視覺影像處理(四)
快速學完OpenCV+python計算機視覺影像處理(五)
以下是快速學完OpenCV+python計算機視覺影像處理的個人總結,
任何知識或者學科都不可能快速學會,一口吃不成大胖子,想要學會,只能一點一點積累,
不積跬步無以至千里,不敲千遍無可能懂理,
想要學會,不能光看,須知熟才能生巧,一定要多敲!一定要多敲!一定要多敲!
視頻鏈接請點擊這里
代碼鏈接請點擊這里 ,提取碼: iukw
看完視頻一定要手動敲,不然最后只是眼睛會了,腦子和手卻不會,
以下是Windows、Linux、Mac深度學習環境搭建詳細教程:
1、windows搭建深度學習環境詳細教程
2、Linux系統搭建深度學習環境詳細教程
3、Mac系統搭建深度學習環境詳細教程
5 影像美化效果
5-1 美化效果章節介紹
影像特效分為以下幾個,分別是:
- 案例1:直方圖
- 案例2:直方圖均衡化
- 案例3:亮度增強
- 案例4:磨皮美白
- 案例5:圖片濾波
- 案例6:高斯濾波
5-2 彩色圖片直方圖
直方圖用的是OpenCV里面的calcHist函式,其定義如下:
cv2.calcHist(images, channels, mask, histSize, ranges[, hist[, accumulate ]])
calcHist函式具體引數定義如下:
- imaes:輸入的影像;
- channels:選擇影像的通道
- mask:掩膜,是一個大小和image一樣的np陣列,其中把需要處理的部分指定為1,不需要處理的部分指定為0,一般設定為None,表示處理整幅影像
- histSize:使用多少個bin(柱子),一般為256
- ranges:像素值的范圍,一般為[0,255]表示0~255
- [, hist[, accumulate ]]這兩個引數基本不用管,
- 注:除了mask,其他四個引數都要帶[]號,
代碼如下:
# 彩色圖片直方圖
import cv2
import numpy as np
def ImageHist(image, channel):
color = (0, 0, 0) # 初始化一個color
window_name = 'Gray' # 初始化一個視窗名
if channel == 0: # 第一個通道為藍色B
color = (255, 0, 0)
window_name = 'B Hist'
elif channel == 1: # 第二個通道為綠色G
color = (0, 255, 0)
window_name = 'G Hist'
elif channel == 2: # 第三個通道為紅色R
color = (0, 0, 255)
window_name = 'R Hist'
# hist是一個shape為(256,1)的陣列,表示0-255每個像素值對應的像素個數,下標即為相應的像素值
hist = cv2.calcHist([image], [0], None, [256], [0.0, 255.0])
# 獲取hist的最小最大值和最小最大值的索引
min_value, max_value, min_index, max_index = cv2.minMaxLoc(hist)
# 創建一個模板
hist_img = np.zeros([256, 256, 3], np.uint8)
for h in range(256):
inten_normal = int(hist[h] * 256 / max_value)
cv2.line(hist_img, (h, 256), (h, 256 - inten_normal), color)
cv2.imshow(window_name, hist_img)
return hist_img
img = cv2.imread('00.jpg', 1)
cv2.imshow('img', img)
channels = cv2.split(img) # 使用split將彩色影像拆分成三個通道
for i in range(0, 3):
ImageHist(channels[i], i) # 呼叫ImageHist函式,第一個引數為B、G、R三原色圖片,第二個引數為通道索引
cv2.waitKey(0)
運行結果如下:

將代碼稍微改一改,就可以顯示灰度影像直方圖啦,代碼如下:
# 灰色影像直方圖
import cv2
import numpy as np
def ImageHist(image):
# hist是一個shape為(256,1)的陣列,表示0-255每個像素值對應的像素個數,下標即為相應的像素值
hist = cv2.calcHist([image], [0], None, [256], [0.0, 255.0])
# 獲取hist的最小最大值和最小最大值的索引
min_value, max_value, min_index, max_index = cv2.minMaxLoc(hist)
# 創建一個模板
hist_img = np.zeros([256, 256, 3], np.uint8)
for h in range(256):
inten_normal = int(hist[h] * 256 / max_value)
cv2.line(hist_img, (h, 256), (h, 256 - inten_normal), 255)
cv2.imshow('histImg', hist_img)
return hist_img
img = cv2.imread('01.jpg', 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
ImageHist(gray)
cv2.waitKey(0)
運行結果如下:

5-3 直方圖均衡化
直方圖均衡化要用到的函式是cv2.equalizeHist(),
- 灰度影像直方圖均衡化可以直接使用
cv2.equalizeHist(), - 彩色影像直方圖均衡化需要將原影像進行拆分,使用
cv2.split函式可以將影像拆分,拆分之后對單通道直方圖進行均衡化,最后需要將均衡化后的影像合并,使用的是cv2.merge函式, - YUV影像直方圖均衡化也需要拆分再合并才行,
具體代碼如下:
import cv2
img = cv2.imread('02.jpg', 1)
# 灰色影像 直方圖均衡化
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray) # 灰色影像
gray_dst = cv2.equalizeHist(gray)
cv2.imshow('gray_dst', gray_dst) # 灰色影像均衡化
# 彩色影像 直方圖均衡化
cv2.imshow('img', img) # 彩色影像
(b, g, r) = cv2.split(img) # 通道拆分
b_hist = cv2.equalizeHist(b)
g_hist = cv2.equalizeHist(g)
r_hist = cv2.equalizeHist(r)
img_dst = cv2.merge((b_hist, g_hist, r_hist)) # 通道合并
cv2.imshow('img_dst', img_dst) # 彩色影像均衡化
# YUV影像 直方圖均衡化
imgYUV = cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
cv2.imshow('imgYUV', imgYUV) # YUV影像
channelYUV = cv2.split(imgYUV) # 通道拆分
channelYUV[0] = cv2.equalizeHist(channelYUV[0])
channels = cv2.merge(channelYUV) # 通道合并
yuv_dst = cv2.cvtColor(channels, cv2.COLOR_YCrCb2BGR)
cv2.imshow('yuv_dst', yuv_dst)
cv2.waitKey(0)
運行結果如下:

5-4 圖片修補
運行代碼如下:
import cv2
import numpy as np
img = cv2.imread('03.jpg', 1)
cv2.imshow('src', img)
print(img.shape)
for i in range(200, 300):
img[i, 200] = (255, 255, 255)
img[i, 200 + 1] = (255, 255, 255)
img[i, 200 - 1] = (255, 255, 255)
for i in range(150, 250):
img[250, i] = (255, 255, 255)
img[250 + 1, i] = (255, 255, 255)
img[250 - 1, i] = (255, 255, 255)
cv2.imwrite('03damaged.jpg', img)
damaged = cv2.imread('03damaged.jpg', 1)
cv2.imshow('damaged', damaged)
damagedInfo = damaged.shape
height = damagedInfo[0]
width = damagedInfo[1]
paint = np.zeros((height, width, 1), np.uint8)
for i in range(200, 300):
paint[i, 200] = 255
paint[i, 200 + 1] = 255
paint[i, 200 - 1] = 255
for i in range(150, 250):
paint[250, i] = 255
paint[250 + 1, i] = 255
paint[250 - 1, i] = 255
cv2.imshow('paint', paint)
# 1.src 2.mask
imgDst = cv2.inpaint(damaged, paint, 3, cv2.INPAINT_TELEA)
cv2.imshow('imgDst', imgDst)
cv2.waitKey(0)
運行結果如下:

5-5 灰度直方圖原始碼
代碼如下:
# 1 0-255 2 概率
# 本質:統計每個像素灰度出現的概率,橫坐標為0-255(256個數),縱坐標是出現的概率p
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('15.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
count = np.zeros(256, np.float)
for i in range(0, height):
for j in range(0, width):
pixel = gray[i, j] # 獲取每一個灰度等級的像素
index = int(pixel)
count[index] = count[index] + 1
for i in range(0, 255):
count[i] = count[i] / (height * width)
x = np.linspace(0, 255, 256)
y = count
plt.bar(x, y, 0.9, alpha=1, color='b')
plt.show()
cv2.waitKey(0)
運行結果如下:

5-6 彩色直方圖原始碼
代碼如下:
# 本質:統計每個像素灰度 出現的概率 0-255 p
import cv2
import numpy as np
import matplotlib.pyplot as plt
img = cv2.imread('04.jpg', 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
for i in range(0, 256):
count_b[i] = count_b[i] / (height * width)
count_g[i] = count_g[i] / (height * width)
count_r[i] = count_r[i] / (height * width)
x = np.linspace(0, 255, 256) # 將0-255按照等分成256份
plt.subplot(221)
plt.imshow(img)
plt.title('img')
yb = count_b
plt.subplot(222)
plt.title('b')
plt.bar(x, yb, 0.9, alpha=1, color='b')
yg = count_g
plt.subplot(223)
plt.title('g')
plt.bar(x, yg, 0.9, alpha=1, color='g')
yr = count_r
plt.subplot(224)
plt.title('r')
plt.bar(x, yr, 0.9, alpha=1, color='r')
plt.tight_layout()
plt.show()
cv2.waitKey(0)
運行結果如下:

5-7 灰度直方圖均衡化
代碼如下:
# 本質:統計每個像素灰度 出現的概率 0-255 p
# 累計概率
# 1 0.2 0.2
# 2 0.3 0.5
# 3 0.1 0.6
# 256
# 100 0.5 255*0.5 = new
import cv2
import numpy as np
img = cv2.imread('05.jpg', 1)
cv2.imshow('src', img)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
cv2.imshow('gray', gray)
count = np.zeros(256, np.float)
for i in range(0, height):
for j in range(0, width):
pixel = gray[i, j]
index = int(pixel)
count[index] = count[index] + 1
for i in range(0, 255):
count[i] = count[i] / (height * width)
# 計算累計概率
sum1 = float(0)
for i in range(0, 256):
sum1 = sum1 + count[i]
count[i] = sum1
# 計算映射表
map1 = np.zeros(256, np.uint16)
for i in range(0, 256):
map1[i] = np.uint16(count[i] * 255)
# 映射
for i in range(0, height):
for j in range(0, width):
pixel = gray[i, j]
gray[i, j] = map1[pixel]
cv2.imshow('dst', gray)
cv2.waitKey(0)
運行結果如下:

5-8 彩色直方圖均衡化
代碼如下:
# 本質:統計每個像素灰度 出現的概率 0-255 p
# 累計概率
# 1 0.2 0.2
# 2 0.3 0.5
# 3 0.1 0.6
# 256
# 100 0.5 255*0.5 = new
# 1 統計每個顏色出現的概率 2 累計概率 1 3 0-255 255*p
# 4 pixel
import cv2
import numpy as np
img = cv2.imread('06.jpg', 1)
cv2.imshow('src', img)
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
for i in range(0, 255):
count_b[i] = count_b[i] / (height * width)
count_g[i] = count_g[i] / (height * width)
count_r[i] = count_r[i] / (height * width)
# 計算累計概率
sum_b = float(0)
sum_g = float(0)
sum_r = float(0)
for i in range(0, 256):
sum_b = sum_b + count_b[i]
sum_g = sum_g + count_g[i]
sum_r = sum_r + count_r[i]
count_b[i] = sum_b
count_g[i] = sum_g
count_r[i] = sum_r
# print(count)
# 計算映射表
map_b = np.zeros(256, np.uint16)
map_g = np.zeros(256, np.uint16)
map_r = np.zeros(256, np.uint16)
for i in range(0, 256):
map_b[i] = np.uint16(count_b[i] * 255)
map_g[i] = np.uint16(count_g[i] * 255)
map_r[i] = np.uint16(count_r[i] * 255)
# 映射
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]
b = map_b[b]
g = map_g[g]
r = map_r[r]
dst[i, j] = (b, g, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)
運行結果如下:

5-9 亮度增強
代碼如下:
# p = p+40
import cv2
import numpy as np
img = cv2.imread('07.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src', img)
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)
運行結果如下:

5-10 磨皮美白
代碼如下:
import cv2
import numpy as np
img = cv2.imread('08.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
cv2.imshow('src', img)
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 * 1.3) + 15
gg = int(g * 1.2) + 20
rr = int(r * 1.2) + 10
if bb > 255:
bb = 255
if gg > 255:
gg = 255
dst[i, j] = (bb, gg, r)
cv2.imshow('dst', dst)
cv2.waitKey(0)
運行結果如下:

5-11 高斯均值濾波
代碼如下:
import cv2
import numpy as np
img = cv2.imread('09.jpg', 1)
cv2.imshow('img', img)
# 方法一:使用OpenCV中的GaussianBlur進行高斯濾波
dst1 = cv2.GaussianBlur(img, (5, 5), 1.5)
cv2.imshow('dst1', dst1)
# 方法二:修改原始碼記性高斯濾波
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
dst2 = 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)
dst2[i, j] = (b, g, r)
cv2.imshow('dst2', dst2)
cv2.waitKey(0)
運行結果如下:

5-12 中值濾波
代碼如下:
# 中值濾波 3*3
import cv2
import numpy as np
img = cv2.imread('05.jpg', 1)
imgInfo = img.shape
height = imgInfo[0]
width = imgInfo[1]
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
cv2.imshow('src', img)
dst = np.zeros((height, width, 3), np.uint8)
collect = np.zeros(9, 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
# 0 1 2 3 4 5 6 7 8
# 1
for k in range(0, 9):
p1 = collect[k]
for t in range(k + 1, 9):
if p1 < collect[t]:
mid = collect[t]
collect[t] = p1
p1 = mid
dst[i, j] = collect[4]
cv2.imshow('dst', dst)
cv2.waitKey(0)
運行結果如下:

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/286396.html
標籤:python
