文章目錄
- 1.圖片修補
- 2.亮度增強
- 3.磨皮美白
- 4.高斯均值濾波
- 5.中值濾波
1.圖片修補
首先得到一個損壞的影像:
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
for i in range(100,200):
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[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.inpaint來實作影像的修復
第一個引數為要修復的圖片,第二個引數為要修復的位置資訊
import cv2
import numpy as np
img = cv2.imread('damaged.jpg', 1)
paint = np.zeros((img.shape[0], img.shape[1], 1), np.uint8)
for i in range(100,200):
paint[i, 200] = 255
paint[i, 200+1] = 255
paint[i, 200-1] = 255
for i in range(150,250):
paint[150,i] = 255
paint[150+1,i] = 255
paint[150-1,i] = 255
cv2.imshow('paint', paint)
imgDat = cv2.inpaint(img, paint, 3, cv2.INPAINT_TELEA)
cv2.imshow('imgDat', imgDat)
cv2.waitKey(0)

2.亮度增強
原理:將原來的像素點數值增加來增強亮度
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('img', img)
dat = np.zeros(img.shape, np.uint8)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
(b,g,r) = img[i,j]
b = int(b) + 40 if int(b) + 40 < 255 else 255
g = int(g) + 40 if int(g) + 40 < 255 else 255
r = int(r) + 40 if int(r) + 40 < 255 else 255
dat[i,j] = (b,g,r)
cv2.imshow('dat',dat)
cv2.waitKey(0)


樣例2:取影像中各個像素點的顏色通道,讓不同的顏色通道乘以不同的比例后加一個數值得到美化影像
import cv2
import numpy as np
img = cv2.imread('img.jpg', 1)
cv2.imshow('img', img)
dat = np.zeros(img.shape, np.uint8)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
(b,g,r) = img[i,j]
r = int(r * 1.2) + 10 if int(r * 1.2) + 10 < 255 else 255
g = int(g * 1.2) + 10 if int(g * 1.2) + 10 < 255 else 255
dat[i,j] = (b,g,r)
cv2.imshow('dat',dat)
cv2.waitKey(0)

3.磨皮美白
雙邊濾波(Bilateral filter) 是一種非線性的濾波方法,是結合影像的空間鄰近度和像素值相似度的一種折中處理,同時考慮空域資訊和灰度相似性,達到保邊去噪的目的,具有簡單、非迭代、區域的特點 [1] ,雙邊濾波器的好處是可以做邊緣保存(edge preserving),一般過去用的維納濾波或者高斯濾波去降噪,都會較明顯地模糊邊緣,對于高頻細節的保護效果并不明顯,
雙邊濾波器顧名思義比高斯濾波多了一個高斯方差sigma-d,它是基于空間分布的高斯濾波函式,所以在邊緣附近,離的較遠的像素不會太多影響到邊緣上的像素值,這樣就保證了邊緣附近像素值的保存,但是由于保存了過多的高頻資訊,對于彩色影像里的高頻噪聲,雙邊濾波器不能夠干凈的濾掉,只能夠對于低頻資訊進行較好的濾波
下面我們來使用雙邊濾波 cv2.bilateralFilter 來實作影像的磨皮美白方法
import cv2
img = cv2.imread("img2.jpg", 1)
cv2.imshow('img', img)
dat = cv2.bilateralFilter(img, 15,35,35)
cv2.imshow('dat',dat)
cv2.waitKey(0)


4.高斯均值濾波
高斯濾波是一種線性平滑濾波,適用于消除高斯噪聲,廣泛應用于影像處理的減噪程序, [1] 通俗的講,高斯濾波就是對整幅影像進行加權平均的程序,每一個像素點的值,都由其本身和鄰域內的其他像素值經過加權平均后得到,高斯濾波的具體操作是:用一個模板(或稱卷積、掩模)掃描影像中的每一個像素,用模板確定的鄰域內像素的加權平均灰度值去替代模板中心像素點的值,
缺點:得到的影像會變得非常模糊
import cv2
img = cv2.imread("img.jpg", 1)
dat = cv2.GaussianBlur(img, (5,5), 1, 5)
cv2.imshow('img', img)
cv2.imshow('dat', dat)
cv2.waitKey(0)


均值濾波
均值濾波是典型的線性濾波演算法,它是指在影像上對目標像素給一個模板,該模板包括了其周圍的臨近像素(以目標像素為中心的周圍8個像素,構成一個濾波模板,即包括目標像素本身),再用模板中的全體像素的平均值來代替原來像素值
import cv2
import numpy as np
img = cv2.imread("img.jpg", 1)
dat = np.zeros(img.shape, np.uint8)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
sumb,sumg,sumr = 0,0,0
for m in range(-3,3):
for n in range(-3,3):
if i + m >= 0 and i + m < img.shape[0] and j + n >= 0 and j + n < img.shape[1]:
(b,g,r) = img[i + m, j + n]
sumb += int(b)
sumg += int(g)
sumr += int(r)
b = np.uint8(sumb / 36)
g = np.uint8(sumg / 36)
r = np.uint8(sumr / 36)
dat[i, j] = (b,g,r)
cv2.imshow('img', img)
cv2.imshow('dat', dat)
cv2.waitKey(0)


5.中值濾波
import cv2
import numpy as np
img = cv2.imread("img.jpg", 1)
img = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)
dat = np.zeros((img.shape[0],img.shape[1]), np.uint8)
cv2.imshow("img", img)
for i in range(img.shape[0]):
for j in range(img.shape[1]):
collect = []
for m in range(-1, 2):
for n in range(-1,2):
if i + m >= 0 and i + m < img.shape[0] and j + n >= 0 and j + n < img.shape[1]:
gray = img[i + m, j + n]
collect.append(gray)
collect.sort()
if(len(collect) != 0):
dat[i,j] = collect[len(collect) // 2]
cv2.imshow('dat', dat)
cv2.waitKey(0)


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