
图像去噪 图像超分 图像去模糊 图像去雨 图像去雾 压缩 感知 相位恢复 卷积神经网络 图像处理任务以下是针对图像去噪、图像超分、图像去模糊、图像去雨、图像去雾、压缩感知、相位恢复等任务的详细代码示例。我们将使用卷积神经网络CNN和深度学习框架PyTorch来实现这些任务。图像去噪任务描述去除图像中的噪声使图像更加清晰。模型使用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.encodernn.Sequential(nn.Conv2d(3,64,kernel_size3,padding1), nn.ReLU(), nn.Conv2d(64,128,kernel_size3,padding1), nn.ReLU(), nn.MaxPool2d(kernel_size2,stride2))self.decodernn.Sequential(nn.ConvTranspose2d(128,64,kernel_size2,stride2), nn.ReLU(), nn.Conv2d(64,3,kernel_size3,padding1), nn.Sigmoid())def forward(self, x): xself.encoder(x)xself.decoder(x)returnx# 定义数据集class DenoiseDataset(Dataset): def __init__(self, root_dir,transformNone): self.root_dirroot_dir self.transformtransform 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_pathself.image_files[idx]imageImage.open(img_path).convert(RGB)noisy_imagenp.array(image) np.random.normal(0,25, image.size)noisy_imageImage.fromarray(np.uint8(noisy_image))ifself.transform: noisy_imageself.transform(noisy_image)imageself.transform(image)returnnoisy_image, image# 数据增强transformtransforms.Compose([transforms.Resize((256,256)), transforms.ToTensor()])# 创建数据加载器train_datasetDenoiseDataset(path_to_noisy_images,transformtransform)train_loaderDataLoader(train_dataset,batch_size16,shuffleTrue,num_workers4)# 定义模型、损失函数和优化器modelUNet().to(cuda)criterionnn.MSELoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 训练模型def train_model(model, train_loader, criterion, optimizer,num_epochs10):forepochinrange(num_epochs): model.train()running_loss0.0fornoisy_images, clean_imagesintrain_loader: noisy_images, clean_imagesnoisy_images.to(cuda), clean_images.to(cuda)optimizer.zero_grad()outputsmodel(noisy_images)losscriterion(outputs, clean_images)loss.backward()optimizer.step()running_lossloss.item()* noisy_images.size(0)train_lossrunning_loss / len(train_loader.dataset)print(fEpoch {epoch 1}/{num_epochs}, Train Loss: {train_loss:.4f})# 训练模型train_model(model, train_loader, criterion, optimizer,num_epochs10)2. 图像超分辨率 任务描述将低分辨率图像转换为高分辨率图像。 模型使用SRCNNSuper-Resolution Convolutional Neural Network进行图像超分辨率。 python 深色版本 class SRCNN(nn.Module): def __init__(self): super(SRCNN, self).__init__()self.conv1nn.Conv2d(3,64,kernel_size9,padding4)self.conv2nn.Conv2d(64,32,kernel_size1,padding0)self.conv3nn.Conv2d(32,3,kernel_size5,padding2)self.relunn.ReLU()def forward(self, x): xself.relu(self.conv1(x))xself.relu(self.conv2(x))xself.conv3(x)returnx# 定义数据集class SRDataset(Dataset): def __init__(self, root_dir,transformNone): self.root_dirroot_dir self.transformtransform 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_pathself.image_files[idx]imageImage.open(img_path).convert(RGB)low_res_imageimage.resize((64,64),Image.BICUBIC)high_res_imageimage.resize((256,256),Image.BICUBIC)if self.transform:low_res_imageself.transform(low_res_image)high_res_imageself.transform(high_res_image)return low_res_image,high_res_image # 数据增强 transformtransforms.Compose([ transforms.ToTensor()])# 创建数据加载器 train_datasetSRDataset(path_to_images,transformtransform)train_loaderDataLoader(train_dataset,batch_size16,shuffleTrue,num_workers4)# 定义模型、损失函数和优化器 modelSRCNN().to(cuda)criterionnn.MSELoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 训练模型 def train_model(model,train_loader,criterion,optimizer,num_epochs10):for epoch in range(num_epochs):model.train()running_loss0.0for low_res_images,high_res_images in train_loader:low_res_images,high_res_imageslow_res_images.to(cuda),high_res_images.to(cuda)optimizer.zero_grad()outputsmodel(low_res_images)losscriterion(outputs,high_res_images)loss.backward()optimizer.step()running_lossloss.item()*low_res_images.size(0)train_lossrunning_loss/len(train_loader.dataset)print(fEpoch {epoch1}/{num_epochs},Train Loss:{train_loss:.4f})# 训练模型 train_model(model,train_loader,criterion,optimizer,num_epochs10)3.图像去模糊 任务描述去除图像中的模糊使图像更加清晰。 模型使用DeblurGAN进行图像去模糊。 python 深色版本 class DeblurGAN(nn.Module):def __init__(self):super(DeblurGAN,self).__init__()self.encodernn.Sequential(nn.Conv2d(3,64,kernel_size3,padding1),nn.ReLU(),nn.Conv2d(64,128,kernel_size3,padding1),nn.ReLU(),nn.MaxPool2d(kernel_size2,stride2))self.decodernn.Sequential(nn.ConvTranspose2d(128,64,kernel_size2,stride2),nn.ReLU(),nn.Conv2d(64,3,kernel_size3,padding1),nn.Sigmoid())def forward(self,x):xself.encoder(x)xself.decoder(x)return x # 定义数据集 class DeblurDataset(Dataset):def __init__(self,root_dir,transformNone):self.root_dirroot_dir self.transformtransform 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_pathself.image_files[idx] imageImage.open(img_path).convert(RGB)blurred_imageimage.filter(ImageFilter.BLUR)if self.transform:blurred_imageself.transform(blurred_image)imageself.transform(image)return blurred_image,image # 数据增强 transformtransforms.Compose([ transforms.Resize((256,256)), transforms.ToTensor()])# 创建数据加载器train_datasetDeblurDataset(path_to_images,transformtransform)train_loaderDataLoader(train_dataset,batch_size16,shuffleTrue,num_workers4)# 定义模型、损失函数和优化器modelDeblurGAN().to(cuda)criterionnn.MSELoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 训练模型def train_model(model, train_loader, criterion, optimizer,num_epochs10):forepochinrange(num_epochs): model.train()running_loss0.0forblurred_images, clear_imagesintrain_loader: blurred_images, clear_imagesblurred_images.to(cuda), clear_images.to(cuda)optimizer.zero_grad()outputsmodel(blurred_images)losscriterion(outputs, clear_images)loss.backward()optimizer.step()running_lossloss.item()* blurred_images.size(0)train_lossrunning_loss / len(train_loader.dataset)print(fEpoch {epoch 1}/{num_epochs}, Train Loss: {train_loss:.4f})# 训练模型train_model(model, train_loader, criterion, optimizer,num_epochs10)4. 图像去雨 任务描述去除图像中的雨滴使图像更加清晰。 模型使用PReNet进行图像去雨。 python 深色版本 class PReNet(nn.Module): def __init__(self): super(PReNet, self).__init__()self.encodernn.Sequential(nn.Conv2d(3,64,kernel_size3,padding1), nn.ReLU(), nn.Conv2d(64,128,kernel_size3,padding1), nn.ReLU(), nn.MaxPool2d(kernel_size2,stride2))self.decodernn.Sequential(nn.ConvTranspose2d(128,64,kernel_size2,stride2), nn.ReLU(), nn.Conv2d(64,3,kernel_size3,padding1), nn.Sigmoid())def forward(self, x): xself.encoder(x)xself.decoder(x)returnx# 定义数据集class RainRemovalDataset(Dataset): def __init__(self, root_dir,transformNone): self.root_dirroot_dir self.transformtransform 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_pathself.image_files[idx]imageImage.open(img_path).convert(RGB)rainy_imageimage.filter(ImageFilter.GaussianBlur(radius1))ifself.transform: rainy_imageself.transform(rainy_image)imageself.transform(image)returnrainy_image, image# 数据增强transformtransforms.Compose([transforms.Resize((256,256)), transforms.ToTensor()])# 创建数据加载器train_datasetRainRemovalDataset(path_to_images,transformtransform)train_loaderDataLoader(train_dataset,batch_size16,shuffleTrue,num_workers4)# 定义模型、损失函数和优化器modelPReNet().to(cuda)criterionnn.MSELoss()optimizeroptim.Adam(model.parameters(),lr0.001)# 训练模型def train_model(model, train_loader, criterion, optimizer,num_epochs10):forepochinrange(num_epochs): model.train()running_loss0.0forrainy_images, clear_imagesintrain_loader: rainy_images, clear_imagesrainy_images.to(cuda), clear_images.to(cuda)optimizer.zero_grad()outputsmodel(rainy_images)losscriterion(outputs, clear_images)loss.backward()optimizer.step()running_lossloss.item()* rainy_images.size(0)train_lossrunning_loss / len(train_loader.dataset)print(fEpoch {epoch 1}/{num_epochs}, Train Loss: {train_loss:.4f})# 训练模型train_model(model, train_loader, criterion, optimizer,num_epochs10)5. 图像去雾 任务描述去除图像中的雾气使图像更加清晰。 模型使用Dark Channel Prior进行图像去雾。 python 深色版本importcv2 def dark_channel_prior(image,window_size15): dark_channelcv2.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_channeldark_channel.flatten()flat_imageimage.reshape(-1,3)indicesnp.argsort(flat_dark_channel)[-int(0.001* flat_dark_channel.size):]atmospheric_lightnp.median(flat_image[indices],axis0)returnatmospheric_light def transmission_map(image, atmospheric_light,omega0.95,window_size15): norm_image(image - atmospheric_light)/(1- atmospheric_light)transmission1- omega * dark_channel_prior(norm_image, window_size)returntransmission def guided_filter(image, guide, radius, eps): mean_Icv2.boxFilter(image, cv2.CV_64F,(radius, radius))mean_pcv2.boxFilter(guide, cv2.CV_64F,(radius, radius))mean_Ipcv2.boxFilter(image * guide, cv2.CV_64F,(radius, radius))cov_Ipmean_Ip - mean_I * mean_p mean_IIcv2.boxFilter(image * image, cv2.CV_64F,(radius, radius))var_Imean_II - mean_I * mean_I acov_Ip /(var_I eps)bmean_p - a * mean_I mean_acv2.boxFilter(a, cv2.CV_64F,(radius, radius))mean_bcv2.boxFilter(b, cv2.CV_64F,(radius, radius))qmean_a * image mean_breturnq def dehaze(image,omega0.95,t00.1,radius15,eps0.001): dark_channeldark_channel_prior(image,window_sizeradius)atmospheric_lightestimate_atmospheric_light(image, dark_channel)transmissiontransmission_map(image, atmospheric_light, omega,window_sizeradius)transmission_guidedguided_filter(image, transmission, radius, eps)transmission_guidednp.clip(transmission_guided, t0,1)dehazed_image((image-atmospheric_light)/transmission_guided[:,:,None])atmospheric_light return dehazed_image # 读取图像 imagecv2.imread(path_to_hazy_image.jpg)dehazed_imagedehaze(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):Nimage.size Phinp.random.randn(M,N)yPhi image.flatten()return y,Phi def recover_image(y,Phi,alpha0.1,max_iter1000):NPhi.shape[1] xnp.zeros(N)for _ in range(max_iter):residualy-Phi x gradientPhi.T residual xalpha*gradient return x.reshape(image.shape)# 读取图像 imagecv2.imread(path_to_image.jpg,0)y,Phicompressive_sensing(image,M1000)recovered_imagerecover_image(y,Phi)cv2.imwrite(path_to_recovered_image.jpg,recovered_image)7.相位恢复 任务描述从幅度信息中恢复图像的相位信息。 模型使用Gerchberg-Saxton算法进行相位恢复。 python 深色版本 def gerchberg_saxton(magnitude,initial_guess,max_iter1000,tol1e-6):u1initial_guess for _ in range(max_iter):u2np.fft.fftshift(np.fft.ifft2(np.fft.ifftshift(u1)))u2magnitude * np.exp(1j * np.angle(u2))u1_newnp.fft.fftshift(np.fft.fft2(np.fft.ifftshift(u2)))ifnp.linalg.norm(u1 - u1_new)tol:breaku1u1_newreturnu1# 读取图像imagecv2.imread(path_to_image.jpg,0)magnitudenp.abs(np.fft.fft2(image))initial_guessnp.random.randn(*image.shape) 1j * np.random.randn(*image.shape)recovered_imagenp.abs(gerchberg_saxton(magnitude, initial_guess))cv2.imwrite(path_to_recovered_image.jpg, recovered_image)总结以上代码示例涵盖了图像去噪、图像超分辨率、图像去模糊、图像去雨、图像去雾、压缩感知和相位恢复等任务。每个任务都使用了相应的深度学习模型或经典算法并提供了详细的实现步骤