87 lines
4.0 KiB
Python
87 lines
4.0 KiB
Python
import cv2
|
||
import numpy as np
|
||
|
||
def shapen(image): # 銳化處理
|
||
sigma = 100
|
||
blur_img = cv2.GaussianBlur(image, (0, 0), sigma)
|
||
usm = cv2.addWeighted(image, 1.5, blur_img, -0.5, 0)
|
||
|
||
return usm
|
||
|
||
def increase_contrast(image): # 增加資料對比度
|
||
output = image # 建立 output 變數
|
||
alpha = 2
|
||
beta = 10
|
||
cv2.convertScaleAbs(image, output, alpha, beta) # 套用 convertScaleAbs
|
||
|
||
return output
|
||
|
||
def adaptive_histogram_equalization(image):
|
||
ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCR_CB)
|
||
channels = cv2.split(ycrcb)
|
||
clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8, 8))
|
||
clahe.apply(channels[0], channels[0])
|
||
|
||
ycrcb = cv2.merge(channels)
|
||
Change_image = cv2.cvtColor(ycrcb, cv2.COLOR_YCR_CB2BGR)
|
||
|
||
return Change_image
|
||
|
||
def Remove_Background(image, Matrix_Size):
|
||
skinCrCbHist = np.zeros((256,256), dtype= np.uint8)
|
||
cv2.ellipse(skinCrCbHist, (113,155),(23,25), 43, 0, 360, (255, 255, 255), -1) #繪製橢圓弧線
|
||
|
||
img_ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCR_CB)
|
||
y,cr,cb = cv2.split(img_ycrcb) #拆分出Y,Cr,Cb值
|
||
|
||
skin = np.zeros(cr.shape, dtype = np.uint8) #掩膜
|
||
(x,y) = cr.shape
|
||
|
||
# 依序取出圖片中每個像素
|
||
for i in range(x):
|
||
for j in range(y):
|
||
if skinCrCbHist [cr[i][j], cb[i][j]] > 0: #若不在橢圓區間中
|
||
skin[i][j] = 255
|
||
# 如果該像素的灰階度大於 200,調整該像素的透明度
|
||
# 使用 255 - gray[y, x] 可以將一些邊緣的像素變成半透明,避免太過鋸齒的邊緣
|
||
# img_change = cv2.cvtColor(img_change, cv2.COLOR_BGRA2BGR)
|
||
img = cv2.bitwise_and(image, image, mask = skin)
|
||
img_gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
|
||
|
||
h = image.shape[0] # 取得圖片高度
|
||
w = image.shape[1] # 取得圖片寬度
|
||
|
||
for x in range(w):
|
||
for y in range(h):
|
||
if img_gray[y, x] == 0:
|
||
# if x == 0 and y == 0: # 當X Y都在左上角時
|
||
# image[y, x] = Add(1, Matrix_Size, image[y, x]) / Matrix_Size
|
||
# if x == w - 1 and y == 0: # 當X Y都在右上角時
|
||
# image[y, x] = Add(w - Matrix_Size, w, image[y, x]) / Matrix_Size
|
||
# if x == 0 and y == h - 1: # 當X Y都在左下角時
|
||
# image[y, x] = (image[y - 1, x] + image[y - 1, x + 1] + image[y, x + 1]) / 3
|
||
# if x == w - 1 and y == h - 1: # 當X Y都在右下角時
|
||
# image[y, x] = (image[y, x - 1] + image[y - 1, x - 1] + image[y - 1, x]) / 3
|
||
|
||
# if (x > 0 and x < w - 1) and y == 0: # 當上面的X Y從左到右
|
||
# image[y, x] = (image[y, x - 1] + image[y + 1, x - 1] + image[y + 1, x] + image[y, x + 1] + image[y + 1, x + 1]) / 5
|
||
# if (x > 0 and x < w - 1) and y == h - 1: # 當下面的X Y從左到右
|
||
# image[y, x] = (image[y, x - 1] + image[y - 1, x - 1] + image[y - 1, x] + image[y, x + 1] + image[y - 1, x + 1]) / 5
|
||
# if x == 0 and (y > 0 and y < h - 1): # 當左邊的X Y從上到下
|
||
# image[y, x] = (image[y - 1, x] + image[y - 1, x + 1] + image[y, x + 1] + image[y + 1, x + 1] + image[y + 1, x]) / 5
|
||
# if x == w - 1 and (y > 0 and y < h - 1): # 當右邊X Y從上到下
|
||
# image[y, x] = (image[y - 1, x] + image[y - 1, x - 1] + image[y, x - 1] + image[y + 1, x - 1] + image[y + 1, x]) / 5
|
||
|
||
if (x >= 1 and x < w - 1) and (y >= 1 and y < h - 1): # 當y >= 2 且 X >= 2
|
||
image[y, x] = Add(x, y, image, Matrix_Size) / Matrix_Size
|
||
# BGRA_image[y, x, 3] = 255 - gray[y, x]
|
||
return image
|
||
|
||
|
||
def Add(width_Center, Height_Center, image, Mask_Size):
|
||
total = 0
|
||
for i in range(Mask_Size):
|
||
for j in range(Mask_Size):
|
||
total += image[width_Center - ((Mask_Size - 1) / 2) + j, Height_Center - ((Mask_Size - 1) / 2) + i]
|
||
|
||
return total |