原图像设为f(x,y),退化图像设为g(x,y),由于相机等一些因素造成了图像退化,退化过程借助点扩张函数h(x,y)可以表示为下式,求如图所示不同h(x,y)时输出图像。
损失图像生成(以扩张函数a为例):
#degradation.py
import cv2
import numpy as np
def apply_degradation(image_path, degradation_kernel_path, output_path):
# 读取原图像
f = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
# 读取点扩张函数
h = cv2.imread(degradation_kernel_path, cv2.IMREAD_GRAYSCALE)
h = h / np.sum(h) # 归一化h以保持能量不变
# 使用点扩张函数对原图像进行卷积,模拟退化过程
g = cv2.filter2D(f, -1, h)
# 将退化后的图像保存到指定路径
cv2.imwrite(output_path, g)
# 指定输出图像的路径
output_path = "degraded_image.png"
# 应用退化过程并保存结果
apply_degradation("512x512.png", "a.png", output_path)
print(f"Degraded image saved as {output_path}")
a扩张函数的生成:
#a_create.py:
from PIL import Image, ImageDraw
def generate_image(output_path, target_size):
# 创建黑色底图
image = Image.new("RGB", target_size, "black")
# 创建画布
draw = ImageDraw.Draw(image)
# 计算点的坐标
point1 = (target_size[0] * 3 // 7, target_size[1] // 2)
point2 = (target_size[0] * 4 // 7, target_size[1] // 2)
# 绘制两个白色点
draw.point(point1, fill="white")
draw.point(point2, fill="white")
# 保存图片
image.save(output_path)
# 输出图片路径
output_path = "a.png"
# 目标尺寸
target_size = (512, 512)
# 生成图片
generate_image(output_path, target_size)
print("a扩张函数已经生成")
b扩张函数的生成:
#b_create.py
from PIL import Image, ImageDraw
def generate_image(output_path, target_size):
# 创建黑色底图
image = Image.new("RGB", target_size, "black")
# 创建画布
draw = ImageDraw.Draw(image)
# 计算线的起点和终点
line_start = (target_size[0] // 2, target_size[1] *3 // 7)
line_end = (target_size[0] // 2, target_size[1] * 4 // 7)
# 绘制白色竖线
draw.line([line_start, line_end], fill="white", width=1)
# 保存图片
image.save(output_path)
# 输出图片路径
output_path = "b.png"
# 目标尺寸
target_size = (512, 512)
# 生成图片
generate_image(output_path, target_size)
print("b扩张函数已经生成")
c扩张函数的生成:
#c_create.py
from PIL import Image, ImageDraw
def generate_image(output_path, target_size):
# 创建黑色底图
image = Image.new("RGB", target_size, "black")
# 创建画布
draw = ImageDraw.Draw(image)
# 计算线的起点和终点
line_start = (target_size[0] *3 // 7, target_size[1] // 2)
line_end = (target_size[0] * 4 // 7, target_size[1] // 2)
# 绘制白色线条
draw.line([line_start, line_end], fill="white", width=1)
# 保存图片
image.save(output_path)
# 输出图片路径
output_path = "c.png"
# 目标尺寸
target_size = (512, 512)
# 生成图片
generate_image(output_path, target_size)
print("c扩张函数已经生成")
d扩张函数的生成:
#d_create.py
from PIL import Image, ImageDraw
def generate_image(output_path, target_size):
# 创建黑色底图
image = Image.new("RGB", target_size, "black")
# 创建画布
draw = ImageDraw.Draw(image)
# 计算点的坐标
point_y = target_size[1] // 7
point1 = (target_size[0] // 2, point_y * 3)
point2 = (target_size[0] // 2, point_y * 4)
# 绘制两个白色点
draw.point(point1, fill="white")
draw.point(point2, fill="white")
# 保存图片
image.save(output_path)
# 输出图片路径
output_path = "d.png"
# 目标尺寸
target_size = (512, 512)
# 生成图片
generate_image(output_path, target_size)
print("d扩张函数已经生成")
效果如图:
作者:henu 21级 数据科学与大数据技术 空午