使用opencv创建类似近视眼的图片模糊

2023年07月05日08:48:20

最近侄子上一年级近视了,一个100度,一个75度。正好放暑假了,停掉了了他的所有兴趣班和辅导班,让他放松两个月再看恢复情况。为了更加精确的评估他的近视程度,我对视力表的字母E做了一个逐渐模糊的,每种模糊都保存为一张图片。这样侄子在测试视力表的时候,可以再指认出看到的模糊程度,这样的评估结果就能精确。例如,当他可以看到倒数第5行的时候,这个时候虽然可以看到,但是肯定也不是特别清晰,然后让他指认清晰程度,通过每周进行一次测试,可能第五行的清晰程度就会变好,家长也会更有信心。下面上代码

近视眼效果的模糊主要使用运动模糊+高斯模糊

import cv2
import os
import numpy as np

# 创建output文件夹
output_dir = 'output'
os.makedirs(output_dir, exist_ok=True)

# 加载原始图像
image_path = 'img.png'
original_image = cv2.imread(image_path)

# 逐渐增加模糊并保存结果
for level in range(1,99,2):

    blurred_image = cv2.GaussianBlur(original_image, (level, level), 0)
    # 卷积核必须是奇数
    #blurred_image = cv2.blur(blurred_image, (3, 3))
    # 定义运动模糊的卷积核
    kernel_size = level
    # 定义水平方向运动模糊
    kernel_h = np.zeros((kernel_size, kernel_size), dtype=np.float32)
    # kernel_v = np.zeros((kernel_size, kernel_size), dtype=np.float32)
    kernel_h[int((kernel_size-1)/2), :] = np.ones(kernel_size, dtype=np.float32) / kernel_size
    #kernel_v[:, int((kernel_size-1)/2)] = np.ones(kernel_size, dtype=np.float32) / kernel_size

    # 应用水平和垂直方向的运动模糊
    blurred_image = cv2.filter2D(blurred_image, -1, kernel_h)
    #blurred_image = cv2.filter2D(blurred_image, -1, kernel_v)

 
    output_path = os.path.join(output_dir, f'blurred_{level}.png')
    cv2.imwrite(output_path, blurred_image)

以下是原图

模糊后的结果图(自己拼接在一起)

附录:

在cv2.GaussianBlur函数中,参数0表示标准差(standard deviation)。该函数用于对图像进行高斯平滑处理,通过应用高斯函数对图像进行模糊操作。

函数签名如下:

cv2.GaussianBlur(src, ksize, sigmaX[, dst[, sigmaY[, borderType]]]) -> dst
其中:

src:输入图像,可以是单通道或多通道图像。
ksize:卷积核尺寸,用(width, height)表示。它必须是正的奇数。例如,(5, 5)表示一个5x5的卷积核。
sigmaX:X方向的高斯核标准差,如果设置为0,则根据ksize.width自动计算。
dst:输出图像,可选参数。
sigmaY:Y方向的高斯核标准差,如果设置为0,则与sigmaX相等,可选参数。
borderType:边界模式,可选参数。
在上述示例中,0作为sigmaX的值表示使用自动计算的标准差。这意味着函数将根据ksize.width自动确定标准差,以生成与输入图像相应的高斯卷积核。

如果你想手动指定标准差,可以将sigmaX设置为一个非零值。例如,1表示标准差为1的高斯核。

请注意,高斯平滑操作的效果与标准差的大小相关。较大的标准差会产生更强的平滑效果,而较小的标准差则会产生较弱的平滑效果。

 

posted @ 2023-07-05 09:11  海_纳百川  阅读(15)  评论(0编辑  收藏  举报
本站总访问量