设计要点
1、添加高斯模糊
2、高斯去噪
3、计算信噪比
4、图像前景分割
设计内容
图片的位置与代码处于一个文件夹下;生成的图片也在同一个文件夹下。
①.添加高斯噪声
import cv2
import numpy as np
import math
# 加高斯噪声
def clamp(pv):
if pv > 255:
return 255
if pv < 0:
return 0
else:
return pv
def gaussian_noise(image):
h, w, c = image.shape
for row in range(h):
for col in range(w):
s = np.random.normal(0, 25, 3)# 产生随机数,每次产生三个
b = image[row, col, 0] # blue
g = image[row, col, 1] # green
r = image[row, col, 2] # red
image[row, col, 0] = clamp(b + s[0])
image[row, col, 1] = clamp(g + s[1])
image[row, col, 2] = clamp(r + s[2])
cv2.imshow("noise_image", image)
cv2.imwrite('noise.png', image)
src = cv2.imread('tiger.png')
cv2.imshow('input_image', src)
其中src = cv2.imread('tiger.png')
中的’tiger.png
'更改为需要添加高斯模糊的图片。
②.高斯去噪(高斯模糊)
import cv2
import numpy as np
import math
src = cv2.imread('tiger.png')
#高斯模糊
gaussian_noise(src)
dst = cv2.GaussianBlur(src, (5,5), 0)
cv2.imshow("Gaussian_Blur", dst)
cv2.imwrite('Gaussian_Blur.png', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
其中src = cv2.imread('tiger.png')
中的tiger.png
更改为需要添加高斯模糊的图片。
③.计算图片信噪比
import cv2
import numpy as np
import math
#计算峰值信噪比
def psnr(img1, img2):
mse = np.mean( (img1/255. - img2/255.) ** 2 )
if mse < 1.0e-10:
return 100
PIXEL_MAX = 1
return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))
ori_img = cv2.imread('tiger.png') #原始图片
den_img= cv2.imread('Gaussian_Blur.png') #去噪后的图片
print(psnr(ori_img,den_img))
其中ori_img = cv2.imread('tiger.png')
中的tiger.png
更改为原始图片名;den_img= cv2.imread('Gaussian_Blur.png')
中的Gaussian_Blur.png
为添加模糊后的图片。
④.基于Grabcut算法的前景分割
import cv2
import numpy as np
import math
#基于Grabcut算法的前景分割
src = cv2.imread("Gaussian_Blur.png")
src = cv2.resize(src, (0,0), fx=0.5, fy=0.5)
r = cv2.selectROI('input', src, False) # 返回 (x_min, y_min, w, h)
roi = src[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]# roi区域
mask = np.zeros(src.shape[:2], dtype=np.uint8)# 原图mask
rect = (int(r[0]), int(r[1]), int(r[2]), int(r[3])) # 矩形roi
bgdmodel = np.zeros((1,65),np.float64) # bg模型的临时数组
fgdmodel = np.zeros((1,65),np.float64) # fg模型的临时数组
cv2.grabCut(src,mask,rect,bgdmodel,fgdmodel, 11, mode=cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==1) + (mask==3), 255, 0).astype('uint8')# 提取前景和可能的前景区域
result = cv2.bitwise_and(src,src,mask=mask2)
cv2.imwrite('forward.png', result) #保存分割后的图片,可自由命名。
cv2.imshow("forard", result) #显示分割后的图片
cv2.waitKey(0)
cv2.destroyAllWindows()
其中src = cv2.imread("Gaussian_Blur.png")
中的Gaussian_Blur.png
为需要前景分割的照片。
总体代码
对图片依次进行以下操作:添加高斯噪声、高斯去噪、计算信噪比、前景分割。
import cv2
import numpy as np
import math
# 加高斯噪声
def clamp(pv):
if pv > 255:
return 255
if pv < 0:
return 0
else:
return pv
def gaussian_noise(image):
h, w, c = image.shape
for row in range(h):
for col in range(w):
s = np.random.normal(0, 25, 3)# 产生随机数,每次产生三个
b = image[row, col, 0] # blue
g = image[row, col, 1] # green
r = image[row, col, 2] # red
image[row, col, 0] = clamp(b + s[0])
image[row, col, 1] = clamp(g + s[1])
image[row, col, 2] = clamp(r + s[2])
cv2.imshow("noise_image", image)
cv2.imwrite('noise.png', image)
src = cv2.imread('tiger.png')
cv2.imshow('input_image', src)
#高斯模糊
gaussian_noise(src)
dst = cv2.GaussianBlur(src, (5,5), 0)
cv2.imshow("Gaussian_Blur", dst)
cv2.imwrite('Gaussian_Blur.png', dst)
cv2.waitKey(0)
cv2.destroyAllWindows()
#计算峰值信噪比
def psnr(img1, img2):
mse = np.mean( (img1/255. - img2/255.) ** 2 )
if mse < 1.0e-10:
return 100
PIXEL_MAX = 1
return 20 * math.log10(PIXEL_MAX / math.sqrt(mse))
ori_img = cv2.imread('tiger.png')
den_img= cv2.imread('Gaussian_Blur.png')
print(psnr(ori_img,den_img))
#基于Grabcut算法的前景分割
src = cv2.imread("Gaussian_Blur.png")
src = cv2.resize(src, (0,0), fx=0.5, fy=0.5)
r = cv2.selectROI('input', src, False) # 返回 (x_min, y_min, w, h)
roi = src[int(r[1]):int(r[1]+r[3]), int(r[0]):int(r[0]+r[2])]# roi区域
mask = np.zeros(src.shape[:2], dtype=np.uint8)# 原图mask
rect = (int(r[0]), int(r[1]), int(r[2]), int(r[3])) # 矩形roi
bgdmodel = np.zeros((1,65),np.float64) # bg模型的临时数组
fgdmodel = np.zeros((1,65),np.float64) # fg模型的临时数组
cv2.grabCut(src,mask,rect,bgdmodel,fgdmodel, 11, mode=cv2.GC_INIT_WITH_RECT)
mask2 = np.where((mask==1) + (mask==3), 255, 0).astype('uint8')# 提取前景和可能的前景区域
result = cv2.bitwise_and(src,src,mask=mask2)
cv2.imwrite('forward.png', result)
cv2.imshow("forard", result)
cv2.waitKey(0)
cv2.destroyAllWindows()
有问题请留言,会及时回复的。