使用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的高斯核。 请注意,高斯平滑操作的效果与标准差的大小相关。较大的标准差会产生更强的平滑效果,而较小的标准差则会产生较弱的平滑效果。
本文来自博客园,作者:海_纳百川,转载请注明原文链接:https://www.cnblogs.com/chentiao/p/17527625.html,如有侵权联系删除