opencv入门一百题

这篇博客介绍了三种图像处理技术:平均值池化、最大值池化和高斯过滤。平均值池化通过计算区域内的像素平均值来减小图像尺寸;最大值池化则选择区域内的最大像素值;高斯过滤使用3x3高斯核(标准偏差1.3)进行图像平滑,去除噪声。示例代码展示了如何在Python中使用OpenCV实现这些操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Question7 平均值池化

这里,将图像网格分割(分成某个固定长度的区域),用画区域内(单元格)的平均值来填充该区域内的值。
这样分割网格,求出该区域内的代表值的操作被称为“Pooling”。
这些带环操作在CNN(Convolutional Neural Network中起着重要的作用。
这个由以下公式定义。这里所说的R是进行普林的区域。即,在3×3的区域进行普林。|R|=3x3=9。

v = 1/|R| * Sum_{i in R} v_i

在这里imori.jpg因为是128x128,所以将网格分割为8x8,进行平均带环。

import cv2
import numpy as np
image_path = './images/imori.jpg'
image = cv2.imread(image_path)

out = image.copy()
G = 8
H, W, C = image.shape
Nh = int(H / G)
Nw = int(W / G)

for y in range(Nh):
    for x in range(Nw):
        for c in range(C):
            out[G*y:G*(y+1), G*x:G*(x+1), c] = np.mean(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)

cv2.imshow('out', out)
cv2.waitKey(0)
cv2.destroyAllWindows()

Question8 最大值池化

在这里不要用平均值而是用最大值进行循环。

import cv2
import numpy as np
image_path = './images/imori.jpg'
image = cv2.imread(image_path)

out = image.copy()
G = 8
H, W, C = image.shape
Nh = int(H / G)
Nw = int(W / G)

for y in range(Nh):
    for x in range(Nw):
        for c in range(C):
            out[G*y:G*(y+1), G*x:G*(x+1), c] = np.max(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)

cv2.imshow('Gaussian', out)
cv2.waitKey(0)
cv2.destroyAllWindows()
Question9 高斯过滤

安装高斯过滤器(3x3、标准偏差1.3),imorinoise.jpg去除杂音。
高斯滤波器是进行图像的平滑化(平滑)的滤波器的一种,也用于去除噪声
除噪声之外,还包括中值滤波器(Q.10)、平滑滤波器(Q.11)、LoG滤波器(Q.19)等。
高斯滤波器通过高斯分布的加权对关注像素的周边像素进行平滑化,并用以下公式定义。
这种重量被称为“内核”和“过滤器”。
但是,由于图像的端部不能就这样进行滤波,所以像素不足的部分用0填充。这被称为“0填充”。
并且,权重正规化。(sum g = 1)
权重由高斯分布变为下式。

权重g(x,y,s)=1/(2*pi*sigma*sigma)*exp(-(x^2+y^2)/(2*s^2))
标准偏差s=1.3的8附近高斯过滤器
            1 2 1
K =  1/16 [ 2 4 2 ]
            1 2 1
import cv2
import numpy as np
image_path = './images/imori_noise.jpg'
image = cv2.imread(image_path)

K_size = 3
sigma = 1.3
if len(image.shape) == 3:
    H, W, C = image.shape
else:
    image = np.expand_dims(image, axis=-1)
    H, W, C = image.shape

pad = K_size // 2
out = (np.zeros((H + pad * 2, W + pad * 2, C), dtype=np.float))
out[pad: pad + H, pad: pad + W] = image.copy().astype(np.float)

K = np.zeros((K_size, K_size), dtype=np.float)
for x in range(-pad, -pad + K_size):
    for y in range(-pad, -pad + K_size):
        K[y + pad, x + pad] = np.exp(-(x ** 2 + y ** 2)/(2 * (sigma ** 2)))
K /= (2 * np.pi * sigma * sigma)
K /= K.sum()

tmp = out.copy()

for y in range(H):
    for x in range(W):
        for c in range(C):
            out[pad + y, pad + x, c] = np.sum(K * tmp[y: y + K_size, x: x + K_size, c])

out = np.clip(out, 0, 255)
out = out[pad: pad + H, pad: pad + W].astype(np.uint8)

cv2.imshow('OUT', out)
cv2.waitKey(0)
cv2.destroyAllWindows()
import cv2
import numpy as np
image_path = './images/imori_noise.jpg'
image = cv2.imread(image_path)

blur = cv2.GaussianBlur(image, (3, 3), 0) # 高斯模糊,高斯核的宽和高必须是奇数

cv2.imshow('Gaussian', blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值