opevcv高斯噪声,椒盐噪声;均值滤波;中值滤波,水平检测算子;垂直检测算子

218 阅读3分钟

(1)图像A,加高斯噪声,椒盐噪声;均值滤波;中值滤波;

 

#代码部分

#加入高斯噪声

import cv2
from matplotlib import pyplot as plt
import numpy as np
import time
import random
import math
import os
import re


#加入高斯噪声
def add_noise_Guass(img, mean=0, var=0.01):  # 添加高斯噪声
    img = np.array(img / 255, dtype=float)# 将原始图像的像素值进行归一化,除以255使得像素值在0-1之间
    noise = np.random.normal(mean, var ** 0.5, img.shape)
    #0.01的0.5次幂,ctrl点击normal函数可见参数
    #给出均值为loc,标准差为scale的高斯随机数(场)
    '''
    numpy.random.normal(loc=0.0, scale=1.0, size=None)
    loc:float
    此概率分布的均值(对应着整个分布的中心centre)
    scale:float
    此概率分布的标准差(对应于分布的宽度,scale越大越矮胖,scale越小,越瘦高)
    size:int or tuple of ints
    输出的shape,默认为None,只输出一个值
    '''
    out_img = img + noise# 将噪声和原始图像进行相加得到加噪后的图像
    if out_img.min() < 0:
        low_clip = -1
    else:
        low_clip = 0
        out_img = np.clip(out_img, low_clip, 1.0)#clip函数将元素的大小限制在了low_clip和1之间了,小于的用low_clip代替,大于1的用1代替
        out_img = np.uint8(out_img * 255)# 解除归一化,乘以255将加噪后的图像的像素值恢复
    return out_img


img1 = cv2.imread('nilu.jpg')  # 使用opencv获取的图片, 图片的类型为numpy.array
out_img = add_noise_Guass(img1)
cv2.imshow("imggaosi", out_img)
cv2.waitKey(0)



效果图:下边的是原图,上边的是加入了高斯噪声的图

image.png

image.png

加入椒盐噪声和中值滤波函数调用


import cv2
from matplotlib import pyplot as plt
import numpy as np
import time
import random
import math
import os
import re
def sp_noise(image, amount):

    output = image.copy()
    threshold = 1 - amount#传入的参数,设置一个阙值
    #amount 越大,白色越多
    for i in range(image.shape[0]):#shape[0]表示图片高
        for j in range(image.shape[1]):#图片宽
            rdm = random.random()#取0到1之间的浮点数
            if rdm < amount: #如果随机数小于参数,那么像素点取黑色
                output[i][j] = 0  #亮度0%,取黑色
            elif rdm > threshold:
                output[i][j] = 255#取白色

    return output

image1 = cv2.imread("nilu.jpg")
image = cv2.resize(image1,(600,337))


noisy1 = sp_noise(image, amount=0.05)
noisy2 = sp_noise(image, amount=0.1)
noisy3 = sp_noise(image, amount=0.2)
#这个是把图片放在同一个相框里
h1 = np.hstack([image, noisy1])
h2 = np.hstack([noisy2, noisy3])
v = np.vstack([h1, h2])

cv2.imshow('out', v)

img_median = cv2.medianBlur(noisy1, 3)#中值滤波

cv2.imshow("quzao",img_median)

效果展示:

image.png

中值滤波函数调用过后:

image.png

注:中值滤波将图像的每个像素用邻域 (以当前像素为中心的正方形区域)像素的中值代替 。与邻域平均法类似,但计算的是中值

均值滤波

即用卷积框覆盖区域内所有像素的平均值来代替中心元素

image.png


import cv2
from matplotlib import pyplot as plt
import numpy as np
import time
import random
import math
import os
import re
'''
cv2.blur(src, ksize, anchor, borderType)
参数:
src:输入的图像
ksize:卷积核的大小
anchor:默认值(-1,-1),表示核中心
borderType:边界类型
'''
# src = cv2.imread("nilu.jpg")
# img = src.copy()

# 调用噪声函数生成噪声图片
# img_sp = sp_noise(img, prob=0.02)  # 噪声比例为0.02
#
# # 均值滤波
img_blur = cv2.blur(noisy1, (5, 5))

# 显示图像
# cv.imshow("sp", img_sp)
cv2.imshow("blur", img_blur)
cv2.waitKey(0)

原噪声图:

image.png

去噪后:

image.png

(2)图像B,应用水平检测算子;垂直检测算子;

from matplotlib import pyplot as plt
import numpy as np
import time
import random
import math
import os
import re
import cv2 as cv
src = cv.imread("nilu.jpg", 0)  # 直接以灰度图方式读入
img = src.copy()

# 计算Sobel卷积结果
x = cv.Sobel(img, cv.CV_16S, 1, 0)
#Sobel(src, ddepth, dx, dy, dst=None, ksize=None, scale=None, delta=None, borderType=None)
y = cv.Sobel(img, cv.CV_16S, 0, 1)
'''
src:传入的图像
ddepth:图像的深度
dx  dy:指求导的阶数。0表示这个方向上没有求导,取值为0、1。
ksize:指Sobel算子的大小,即卷积核的大小,必须为奇数1、3、5、7,默认为3。
注意:如果ksize = -1,就演变为3*3的Scharr算子。
scale:缩放导数的比例常数,默认情况为没有伸缩系数。
borderType:图像边界的模式,默认cv2.BORDER_DEFAULT。
'''
# 转换数据 并 合成
Scale_absX = cv.convertScaleAbs(x)  # 格式转换函数
#def convertScaleAbs(src, dst=None, alpha=None, beta=None) 传入图片即可
Scale_absY = cv.convertScaleAbs(y)
result = cv.addWeighted(Scale_absX, 0.5, Scale_absY, 0.5, 0)  # 图像混合 权重0.5,伽马值0

# 显示图像
fig, axes = plt.subplots(nrows=1, ncols=2, figsize=(10, 8), dpi=100)
axes[0].imshow(img, cmap=plt.cm.gray)
axes[0].set_title("yuantu")
axes[1].imshow(result, cmap=plt.cm.gray)
axes[1].set_title("Sobel")
plt.show()

效果图:

image.png 边缘性检测,可调用摄像头,摄像头代码:

cap = cv2.VideoCapture(0)
while True:
    ret, frame = cap.read()
    hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
    lower_red = np.array([78,43,46])
    upper_red = np.array([99,255,255])
    mask = cv2.inRange(hsv, lower_red, upper_red)
    res = cv2.bitwise_and(frame,frame, mask= mask)
    cv2.imshow('frame',frame)
    cv2.imshow('mask',mask)
    cv2.imshow('res',res)
    if cv2.waitKey(5) & 0xFF == ord('q'):
        break
cv2.destroyAllWindows()
cap.release()'''