首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算图像的SNR,单位为db(分贝)

计算图像的SNR,单位为db(分贝)
EN

Stack Overflow用户
提问于 2021-04-05 15:55:29
回答 1查看 155关注 0票数 0

我创建了一个脚本,将高斯噪声添加到图像中,如何计算该图像的SNR?

代码语言:javascript
复制
def noisy(img,sigma): # noise function
   # ...
   img = np.asarray(img,'double')   # numpy-array of shape (N, M);
   embeadead_line = img[0] # first line/row should not be changed


   img = np.delete(img, (0), axis=0)

   mean = 0.0   # some constant
   std = sigma    # some constant (standard deviation)double
   noisy_img = img + np.random.normal(mean, std, img.shape).astype(np.double)
   noisy_img_clipped = np.clip(noisy_img, 0, 255).astype(np.uint8)  # we might get out of bounds due to noise

   noisy_img_clipped = np.insert(noisy_img_clipped, 0, embeadead_line, 0) # insert embedead line back


   return noisy_img_clipped
EN

回答 1

Stack Overflow用户

发布于 2021-04-05 16:01:21

SNR =μ/σ

其中:μ是平均值或期望值,σ是标准差

所以..。

代码语言:javascript
复制
image_sd = np.std(noisy_img_clipped);
image_mean = np.mean(noisy_img_clipped);
image_snr = image_mean / image_sd;

如果你想在dB中获得它,这可能会很棘手,因为你需要额外的常量,这取决于你正在测量的东西。如果你不知道它是什么,你可以使用1,但通常情况下,对于未知源,在dB中显示信噪比被认为是一个糟糕的方法。

代码语言:javascript
复制
import math    
image_snr_db = 1 * math.log(image_snr,2);

如果你问的是PSNR,等式是不同的,它需要2个图像。原始的和模糊的。使用OpenCV,你可以这样计算它:

代码语言:javascript
复制
import cv2
img1 = cv2.imread(original_image)
img2 = cv2.imread(noisy_image)
psnr = cv2.PSNR(img1, img2)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/66949839

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档