基于opencv的图像高斯模糊和前景分割(python)

设计要点

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()

有问题请留言,会及时回复的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值