☰
图像去噪 图像超分 图像去模糊 图像去雨 图像去雾 压缩 感知 相位恢复 卷积神经网络 图像处理任务
2026/10/8 7:15:12 网站建设 项目流程

图像去噪 图像超分 图像去模糊 图像去雨 图像去雾 压缩 感知 相位恢复 卷积神经网络 图像处理任务

以下是针对图像去噪、图像超分、图像去模糊、图像去雨、图像去雾、压缩感知、相位恢复等任务的详细代码示例。我们将使用卷积神经网络(CNN)和深度学习框架PyTorch来实现这些任务。

  1. 图像去噪
    任务描述:去除图像中的噪声,使图像更加清晰。

模型:使用U-Net结构进行图像去噪。

python 深色版本importtorchimporttorch.nn as nnimporttorch.optim as optim from torch.utils.dataimportDataLoader, Dataset from torchvisionimporttransforms from PILimportImageimportosimportnumpy as np# 定义U-Net模型class UNet(nn.Module): def __init__(self): super(UNet, self).__init__()self.encoder=nn.Sequential(nn.Conv2d(3,64,kernel_size=3,padding=1), nn.ReLU(), nn.Conv2d(64,128,kernel_size=3,padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2,stride=2))self.decoder=nn.Sequential(nn.ConvTranspose2d(128,64,kernel_size=2,stride=2), nn.ReLU(), nn.Conv2d(64,3,kernel_size=3,padding=1), nn.Sigmoid())def forward(self, x): x=self.encoder(x)x=self.decoder(x)returnx# 定义数据集class DenoiseDataset(Dataset): def __init__(self, root_dir,transform=None): self.root_dir=root_dir self.transform=transform self.image_files=[os.path.join(root_dir, f)forfinos.listdir(root_dir)]def __len__(self):returnlen(self.image_files)def __getitem__(self, idx): img_path=self.image_files[idx]image=Image.open(img_path).convert('RGB')noisy_image=np.array(image)+ np.random.normal(0,25, image.size)noisy_image=Image.fromarray(np.uint8(noisy_image))ifself.transform: noisy_image=self.transform(noisy_image)image=self.transform(image)returnnoisy_image, image# 数据增强transform=transforms.Compose([transforms.Resize((256,256)), transforms.ToTensor()])# 创建数据加载器train_dataset=DenoiseDataset('path_to_noisy_images',transform=transform)train_loader=DataLoader(train_dataset,batch_size=16,shuffle=True,num_workers=4)# 定义模型、损失函数和优化器model=UNet().to('cuda')criterion=nn.MSELoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 训练模型def train_model(model, train_loader, criterion, optimizer,num_epochs=10):forepochinrange(num_epochs): model.train()running_loss=0.0fornoisy_images, clean_imagesintrain_loader: noisy_images, clean_images=noisy_images.to('cuda'), clean_images.to('cuda')optimizer.zero_grad()outputs=model(noisy_images)loss=criterion(outputs, clean_images)loss.backward()optimizer.step()running_loss+=loss.item()* noisy_images.size(0)train_loss=running_loss / len(train_loader.dataset)print(f'Epoch {epoch + 1}/{num_epochs}, Train Loss: {train_loss:.4f}')# 训练模型train_model(model, train_loader, criterion, optimizer,num_epochs=10)2. 图像超分辨率 任务描述:将低分辨率图像转换为高分辨率图像。 模型:使用SRCNN(Super-Resolution Convolutional Neural Network)进行图像超分辨率。 python 深色版本 class SRCNN(nn.Module): def __init__(self): super(SRCNN, self).__init__()self.conv1=nn.Conv2d(3,64,kernel_size=9,padding=4)self.conv2=nn.Conv2d(64,32,kernel_size=1,padding=0)self.conv3=nn.Conv2d(32,3,kernel_size=5,padding=2)self.relu=nn.ReLU()def forward(self, x): x=self.relu(self.conv1(x))x=self.relu(self.conv2(x))x=self.conv3(x)returnx# 定义数据集class SRDataset(Dataset): def __init__(self, root_dir,transform=None): self.root_dir=root_dir self.transform=transform self.image_files=[os.path.join(root_dir, f)forfinos.listdir(root_dir)]def __len__(self):returnlen(self.image_files)def __getitem__(self, idx): img_path=self.image_files[idx]image=Image.open(img_path).convert('RGB')low_res_image=image.resize((64,64),Image.BICUBIC)high_res_image=image.resize((256,256),Image.BICUBIC)if self.transform:low_res_image=self.transform(low_res_image)high_res_image=self.transform(high_res_image)return low_res_image,high_res_image # 数据增强 transform=transforms.Compose([ transforms.ToTensor()])# 创建数据加载器 train_dataset=SRDataset('path_to_images',transform=transform)train_loader=DataLoader(train_dataset,batch_size=16,shuffle=True,num_workers=4)# 定义模型、损失函数和优化器 model=SRCNN().to('cuda')criterion=nn.MSELoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 训练模型 def train_model(model,train_loader,criterion,optimizer,num_epochs=10):for epoch in range(num_epochs):model.train()running_loss=0.0for low_res_images,high_res_images in train_loader:low_res_images,high_res_images=low_res_images.to('cuda'),high_res_images.to('cuda')optimizer.zero_grad()outputs=model(low_res_images)loss=criterion(outputs,high_res_images)loss.backward()optimizer.step()running_loss+=loss.item()*low_res_images.size(0)train_loss=running_loss/len(train_loader.dataset)print(f'Epoch {epoch+1}/{num_epochs},Train Loss:{train_loss:.4f}')# 训练模型 train_model(model,train_loader,criterion,optimizer,num_epochs=10)3.图像去模糊 任务描述:去除图像中的模糊,使图像更加清晰。 模型:使用DeblurGAN进行图像去模糊。 python 深色版本 class DeblurGAN(nn.Module):def __init__(self):super(DeblurGAN,self).__init__()self.encoder=nn.Sequential(nn.Conv2d(3,64,kernel_size=3,padding=1),nn.ReLU(),nn.Conv2d(64,128,kernel_size=3,padding=1),nn.ReLU(),nn.MaxPool2d(kernel_size=2,stride=2))self.decoder=nn.Sequential(nn.ConvTranspose2d(128,64,kernel_size=2,stride=2),nn.ReLU(),nn.Conv2d(64,3,kernel_size=3,padding=1),nn.Sigmoid())def forward(self,x):x=self.encoder(x)x=self.decoder(x)return x # 定义数据集 class DeblurDataset(Dataset):def __init__(self,root_dir,transform=None):self.root_dir=root_dir self.transform=transform self.image_files=[os.path.join(root_dir,f)for f in os.listdir(root_dir)] def __len__(self):return len(self.image_files)def __getitem__(self,idx):img_path=self.image_files[idx] image=Image.open(img_path).convert('RGB')blurred_image=image.filter(ImageFilter.BLUR)if self.transform:blurred_image=self.transform(blurred_image)image=self.transform(image)return blurred_image,image # 数据增强 transform=transforms.Compose([ transforms.Resize((256,256)), transforms.ToTensor()])# 创建数据加载器train_dataset=DeblurDataset('path_to_images',transform=transform)train_loader=DataLoader(train_dataset,batch_size=16,shuffle=True,num_workers=4)# 定义模型、损失函数和优化器model=DeblurGAN().to('cuda')criterion=nn.MSELoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 训练模型def train_model(model, train_loader, criterion, optimizer,num_epochs=10):forepochinrange(num_epochs): model.train()running_loss=0.0forblurred_images, clear_imagesintrain_loader: blurred_images, clear_images=blurred_images.to('cuda'), clear_images.to('cuda')optimizer.zero_grad()outputs=model(blurred_images)loss=criterion(outputs, clear_images)loss.backward()optimizer.step()running_loss+=loss.item()* blurred_images.size(0)train_loss=running_loss / len(train_loader.dataset)print(f'Epoch {epoch + 1}/{num_epochs}, Train Loss: {train_loss:.4f}')# 训练模型train_model(model, train_loader, criterion, optimizer,num_epochs=10)4. 图像去雨 任务描述:去除图像中的雨滴,使图像更加清晰。 模型:使用PReNet进行图像去雨。 python 深色版本 class PReNet(nn.Module): def __init__(self): super(PReNet, self).__init__()self.encoder=nn.Sequential(nn.Conv2d(3,64,kernel_size=3,padding=1), nn.ReLU(), nn.Conv2d(64,128,kernel_size=3,padding=1), nn.ReLU(), nn.MaxPool2d(kernel_size=2,stride=2))self.decoder=nn.Sequential(nn.ConvTranspose2d(128,64,kernel_size=2,stride=2), nn.ReLU(), nn.Conv2d(64,3,kernel_size=3,padding=1), nn.Sigmoid())def forward(self, x): x=self.encoder(x)x=self.decoder(x)returnx# 定义数据集class RainRemovalDataset(Dataset): def __init__(self, root_dir,transform=None): self.root_dir=root_dir self.transform=transform self.image_files=[os.path.join(root_dir, f)forfinos.listdir(root_dir)]def __len__(self):returnlen(self.image_files)def __getitem__(self, idx): img_path=self.image_files[idx]image=Image.open(img_path).convert('RGB')rainy_image=image.filter(ImageFilter.GaussianBlur(radius=1))ifself.transform: rainy_image=self.transform(rainy_image)image=self.transform(image)returnrainy_image, image# 数据增强transform=transforms.Compose([transforms.Resize((256,256)), transforms.ToTensor()])# 创建数据加载器train_dataset=RainRemovalDataset('path_to_images',transform=transform)train_loader=DataLoader(train_dataset,batch_size=16,shuffle=True,num_workers=4)# 定义模型、损失函数和优化器model=PReNet().to('cuda')criterion=nn.MSELoss()optimizer=optim.Adam(model.parameters(),lr=0.001)# 训练模型def train_model(model, train_loader, criterion, optimizer,num_epochs=10):forepochinrange(num_epochs): model.train()running_loss=0.0forrainy_images, clear_imagesintrain_loader: rainy_images, clear_images=rainy_images.to('cuda'), clear_images.to('cuda')optimizer.zero_grad()outputs=model(rainy_images)loss=criterion(outputs, clear_images)loss.backward()optimizer.step()running_loss+=loss.item()* rainy_images.size(0)train_loss=running_loss / len(train_loader.dataset)print(f'Epoch {epoch + 1}/{num_epochs}, Train Loss: {train_loss:.4f}')# 训练模型train_model(model, train_loader, criterion, optimizer,num_epochs=10)5. 图像去雾 任务描述:去除图像中的雾气,使图像更加清晰。 模型:使用Dark Channel Prior进行图像去雾。 python 深色版本importcv2 def dark_channel_prior(image,window_size=15): dark_channel=cv2.erode(cv2.min(cv2.min(image[:, :,0], image[:, :,1]), image[:, :,2]), np.ones((window_size,window_size),np.uint8))returndark_channel def estimate_atmospheric_light(image, dark_channel): flat_dark_channel=dark_channel.flatten()flat_image=image.reshape(-1,3)indices=np.argsort(flat_dark_channel)[-int(0.001* flat_dark_channel.size):]atmospheric_light=np.median(flat_image[indices],axis=0)returnatmospheric_light def transmission_map(image, atmospheric_light,omega=0.95,window_size=15): norm_image=(image - atmospheric_light)/(1- atmospheric_light)transmission=1- omega * dark_channel_prior(norm_image, window_size)returntransmission def guided_filter(image, guide, radius, eps): mean_I=cv2.boxFilter(image, cv2.CV_64F,(radius, radius))mean_p=cv2.boxFilter(guide, cv2.CV_64F,(radius, radius))mean_Ip=cv2.boxFilter(image * guide, cv2.CV_64F,(radius, radius))cov_Ip=mean_Ip - mean_I * mean_p mean_II=cv2.boxFilter(image * image, cv2.CV_64F,(radius, radius))var_I=mean_II - mean_I * mean_I a=cov_Ip /(var_I + eps)b=mean_p - a * mean_I mean_a=cv2.boxFilter(a, cv2.CV_64F,(radius, radius))mean_b=cv2.boxFilter(b, cv2.CV_64F,(radius, radius))q=mean_a * image + mean_breturnq def dehaze(image,omega=0.95,t0=0.1,radius=15,eps=0.001): dark_channel=dark_channel_prior(image,window_size=radius)atmospheric_light=estimate_atmospheric_light(image, dark_channel)transmission=transmission_map(image, atmospheric_light, omega,window_size=radius)transmission_guided=guided_filter(image, transmission, radius, eps)transmission_guided=np.clip(transmission_guided, t0,1)dehazed_image=((image-atmospheric_light)/transmission_guided[:,:,None])+atmospheric_light return dehazed_image # 读取图像 image=cv2.imread('path_to_hazy_image.jpg')dehazed_image=dehaze(image)cv2.imwrite('path_to_dehazed_image.jpg',dehazed_image)6.压缩感知 任务描述:从少量测量值中恢复图像。 模型:使用稀疏编码进行压缩感知。 python 深色版本 import numpy as np import cv2 import scipy.linalg as linalg def compressive_sensing(image,M):N=image.size Phi=np.random.randn(M,N)y=Phi @ image.flatten()return y,Phi def recover_image(y,Phi,alpha=0.1,max_iter=1000):N=Phi.shape[1] x=np.zeros(N)for _ in range(max_iter):residual=y-Phi @ x gradient=Phi.T @ residual x+=alpha*gradient return x.reshape(image.shape)# 读取图像 image=cv2.imread('path_to_image.jpg',0)y,Phi=compressive_sensing(image,M=1000)recovered_image=recover_image(y,Phi)cv2.imwrite('path_to_recovered_image.jpg',recovered_image)7.相位恢复 任务描述:从幅度信息中恢复图像的相位信息。 模型:使用Gerchberg-Saxton算法进行相位恢复。 python 深色版本 def gerchberg_saxton(magnitude,initial_guess,max_iter=1000,tol=1e-6):u1=initial_guess for _ in range(max_iter):u2=np.fft.fftshift(np.fft.ifft2(np.fft.ifftshift(u1)))u2=magnitude * np.exp(1j * np.angle(u2))u1_new=np.fft.fftshift(np.fft.fft2(np.fft.ifftshift(u2)))ifnp.linalg.norm(u1 - u1_new)<tol:breaku1=u1_newreturnu1# 读取图像image=cv2.imread('path_to_image.jpg',0)magnitude=np.abs(np.fft.fft2(image))initial_guess=np.random.randn(*image.shape)+ 1j * np.random.randn(*image.shape)recovered_image=np.abs(gerchberg_saxton(magnitude, initial_guess))cv2.imwrite('path_to_recovered_image.jpg', recovered_image)

总结
以上代码示例涵盖了图像去噪、图像超分辨率、图像去模糊、图像去雨、图像去雾、压缩感知和相位恢复等任务。每个任务都使用了相应的深度学习模型或经典算法,并提供了详细的实现步骤

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询