python使用cv2读bytes写bytes流不缓存网络传输加噪声(高斯/椒盐/泊松/斑点)

from PIL import Image, ImageDraw
import random
import io
import cv2
import numpy as np


# 椒盐噪声
def tupian_add_noise_jiaoyan(a):
    image = np.array(bytearray(a), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)
    # np.ndarray转IMAGE
    # 设置添加椒盐噪声的数目比例
    s_vs_p = 0.5
    # 设置添加噪声图像像素的数目
    amount = 0.04
    noise_img = np.copy(image)
    # 添加salt噪声
    num_salt = np.ceil(amount * image.size * s_vs_p)
    # 设置添加噪声的坐标位置
    coords = [np.random.randint(0, i - 1, int(num_salt)) for i in image.shape]
    noise_img[coords] = 255
    # 添加pepper噪声
    num_pepper = np.ceil(amount * image.size * (1. - s_vs_p))
    # 设置添加噪声的坐标位置
    coords = [np.random.randint(0, i - 1, int(num_pepper)) for i in image.shape]
    noise_img[coords] = 0
    img_encode = cv2.imencode('.jpg', noise_img)[1]
    data_encode = np.array(img_encode,dtype="uint8")
    return bytes(data_encode)
# 高斯噪声
def tupian_add_noise_gaosi(a):
    image = np.array(bytearray(a), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)

    # 设置高斯分布的均值和方差
    mean = 0
    # 设置高斯分布的标准差
    sigma = 25
    # 根据均值和标准差生成符合高斯分布的噪声
    gauss = np.random.normal(mean, sigma, (image.shape[0], image.shape[1], cv2.IMREAD_COLOR))
    # 给图片添加高斯噪声
    noisy_img = image + gauss
    # 设置图片添加高斯噪声之后的像素值的范围
    noise_img = np.clip(noisy_img, a_min=0, a_max=255)
    # 保存图片
    img_encode = cv2.imencode('.jpg', noise_img)[1]
    data_encode = np.array(img_encode,dtype="uint8")
    return bytes(data_encode)
# 给图片添加泊松噪声
def tupian_add_noise_baosong(a):
    image = np.array(bytearray(a), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)

    # 计算图像像素的分布范围
    vals = len(np.unique(image))
    vals = 2 ** np.ceil(np.log2(vals))
    # 给图片添加泊松噪声
    noise_img = np.random.poisson(image * vals) / float(vals)
    # 保存图片

    img_encode = cv2.imencode('.jpg', noise_img)[1]
    data_encode = np.array(img_encode,dtype="uint8")
    return bytes(data_encode)
# 给图片添加speckle噪声
def tupian_add_noise_speckle(a):
    image = np.array(bytearray(a), dtype="uint8")
    image = cv2.imdecode(image, cv2.IMREAD_COLOR)

    # 随机生成一个服从分布的噪声
    gauss = np.random.randn(image.shape[0], image.shape[1], cv2.IMREAD_COLOR)
    # 给图片添加speckle噪声
    noise_img = image + image * gauss
    # 归一化图像的像素值
    noise_img = np.clip(noise_img, a_min=0, a_max=255)
    img_encode = cv2.imencode('.jpg', noise_img)[1]
    data_encode = np.array(img_encode,dtype="uint8")
    return bytes(data_encode)

函数输入为bytes,输入也是bytes,可用于网络传输,或者写入文件,不用本地缓存

比如:


response = requests.get('http://www.xxx.com/hsdkfjhsfkj.jpg')
a = tupian_add_noise_jiaoyan(response.content)
with open('xxx.jpg','wb')as f:
    f.write(a)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用OpenCV库来对图像添噪声。下面是一个示例程序,展示如何给图像添高斯噪声椒盐噪声泊松噪声、瑞利噪声、指数分布噪声和均匀分布噪声。 ```python import cv2 import numpy as np # 添高斯噪声 def add_gaussian_noise(image): row, col, ch = image.shape mean = 0 var = 0.1 sigma = var ** 0.5 gauss = np.random.normal(mean, sigma, (row, col, ch)) gauss = gauss.reshape(row, col, ch) noisy_image = image + gauss return noisy_image # 添椒盐噪声 def add_salt_and_pepper_noise(image, ratio=0.05): row, col, ch = image.shape num_pixels = row * col num_salt = int(num_pixels * ratio) coords = [np.random.randint(0, i - 1, num_salt) for i in image.shape] image[coords] = 1 num_pepper = int(num_pixels * ratio) coords = [np.random.randint(0, i - 1, num_pepper) for i in image.shape] image[coords] = 0 return image # 添泊松噪声 def add_poisson_noise(image): vals = len(np.unique(image)) vals = 2 ** np.ceil(np.log2(vals)) noisy_image = np.random.poisson(image * vals) / float(vals) return noisy_image # 添瑞利噪声 def add_rayleigh_noise(image): row, col, ch = image.shape sigma = 0.1 rayleigh = np.random.rayleigh(sigma, (row, col, ch)) noisy_image = image + rayleigh return noisy_image # 添指数分布噪声 def add_exponential_noise(image): row, col, ch = image.shape scale = 0.1 exponential = np.random.exponential(scale, (row, col, ch)) noisy_image = image + exponential return noisy_image # 添均匀分布噪声 def add_uniform_noise(image): row, col, ch = image.shape low = -0.5 high = 0.5 uniform = np.random.uniform(low, high, (row, col, ch)) noisy_image = image + uniform return noisy_image # 读取图像 image_path = 'image.jpg' image = cv2.imread(image_path) # 添高斯噪声 gaussian_noisy_image = add_gaussian_noise(image.copy()) # 添椒盐噪声 salt_and_pepper_noisy_image = add_salt_and_pepper_noise(image.copy()) # 添泊松噪声 poisson_noisy_image = add_poisson_noise(image.copy()) # 添瑞利噪声 rayleigh_noisy_image = add_rayleigh_noise(image.copy()) # 添指数分布噪声 exponential_noisy_image = add_exponential_noise(image.copy()) # 添均匀分布噪声 uniform_noisy_image = add_uniform_noise(image.copy()) # 显示原图和添噪声后的图像 cv2.imshow('Original Image', image) cv2.imshow('Gaussian Noisy Image', gaussian_noisy_image) cv2.imshow('Salt and Pepper Noisy Image', salt_and_pepper_noisy_image) cv2.imshow('Poisson Noisy Image', poisson_noisy_image) cv2.imshow('Rayleigh Noisy Image', rayleigh_noisy_image) cv2.imshow('Exponential Noisy Image', exponential_noisy_image) cv2.imshow('Uniform Noisy Image', uniform_noisy_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 请注意,这只是一个示例程序,你可以根据自己的需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值