图像重建后由于图像块拼接出现图像块效之优化方案

 

目录

 

介绍

方案一:


介绍

         随着深度学习的发展,神经网络已经深入各行各业,这里主要介绍下神经网络对图像的重建问题,这里图像重建可以是图像超分辨,图像增强,图像去噪等等。由于现在的显卡显存的限制,对于分辨率比较大的图像来说,直接将原图作为输入往往会导致显存不够,通常的处理的办法是将原图进行切块处理,对图像块进行重建,然后将图像块进行拼接。下面将一一介绍其方案以优化的方案。

方案一:

         一个很暴力直接的方案就是图像直接非重叠的进行切块,其图解如下图所示:

 

假设上图黑色边界表示原图像的大小,图像的分辨率为1024x1024,现以将图像均切成四等份为例,可以切成上图四个512x512大小的图像块,以上切块像块处理方案没有进行重叠。此时的图像块输入大小为512x512。其图像块作为输入得到重建后的图像块,最后将其进行拼接。这样会导致图像重建后每个图像的边界信息处理后不一致,然后拼接后的图像很明显的出现块效应。如下图所示:

 

可以观察此重建后的图像的局部信息,如下图所示:

很明显的看到会出现图像块效应。

因此需要对其进行改进。

方案二

对于拼接处进行重叠超分重建,然后对重叠部分进行取平均值,具体图解如下:

 以将图像切成4等份的patch为例,蓝色边界表示原图大小,这样会形成红色重叠部分假设红色重叠部分为16个像素宽度,实际每个图像块大小为蓝色图像块大小504x504。此时图像块的输入大小仍然为520x520(512+8)(蓝色部分504加红色重叠部分16),重建后进行原位像素拼接,拼接后对于红色重叠部分进行取平均值。

方案三

通过对实际图像大小的块对外扩充一些像素然后对扩充后的图像进行图像重建,图像块重建后对于重叠部分进行切除舍弃处理。具体图解如下图所示:

蓝色的边界仍然表示原图大小,其中黑色实线表示图像中轴线。首先将图像四周进行padding,padding大小为红色重叠部分16个像素,padding后的图像大小为1056x1056。将padding后的图像进行进行切块,此时的输入图像块大小为548x548(512+16*2)进行重建,然后将重建后的图像块切除四周16个像素得到512x512,最后将其依次拼接起来。对于图像块1,重建后将红色部分切除。对于图像块2,左边部分切除黄色部分。

总结

通过实验表明,通过对方案一改进后的方案二、三能够很好的去除块效应,同时,方案三的效果要比方案二更佳。

  • 1
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
超像素分割算法中的反向操作一般被称为超像素重建,其实现过程主要包括以下几个步骤: 1. 初始化:根据超像素分割算法提取出的超像素的位置和大小,创建一个与原始图像大小相同的空白图像。 2. 遍历超像素:对于每个超像素,将其像素值赋给对应位置的空白图像的像素值。 3. 拼接边界:由于超像素分割算法中的超像素可能存在重叠,因此需要对超像素的边界进行拼接,以避免出现锯齿状的边界。一种简单的方法是使用平均值或者加权平均值对边界像素进行处理。 4. 输出结果:将拼接好的图像输出即可。 以下是一个简单的Python代码示例,实现了超像素分割算法中的重建操作: ```python import numpy as np import cv2 # 超像素位置和大小(假设已经提取出来了) superpixel_blocks = [(0, 0, 50, 50), (40, 40, 80, 80), (70, 70, 120, 120)] # 加载原始图像 img = cv2.imread('input.jpg') # 创建空白图像 reconstructed = np.zeros(img.shape, dtype=np.uint8) # 遍历超像素,将像素值赋给对应位置的空白图像 for block in superpixel_blocks: x, y, w, h = block reconstructed[y:y+h, x:x+w] = img[y:y+h, x:x+w] # 拼接边界 for block1 in superpixel_blocks: for block2 in superpixel_blocks: if block1 == block2: continue x1, y1, w1, h1 = block1 x2, y2, w2, h2 = block2 if x1+w1 == x2: # 左边界 reconstructed[y1:y1+h1, x1+w1:x2] = (img[y1:y1+h1, x1+w1:x2] + img[y1:y1+h1, x2:x2+1]) // 2 if x2+w2 == x1: # 右边界 reconstructed[y1:y1+h1, x1:x2+w2] = (img[y1:y1+h1, x1:x1+1] + img[y1:y1+h1, x2:x2+w2]) // 2 if y1+h1 == y2: # 上边界 reconstructed[y1+h1:y2, x1:x1+w1] = (img[y1+h1:y2, x1:x1+w1] + img[y2:y2+1, x1:x1+w1]) // 2 if y2+h2 == y1: # 下边界 reconstructed[y2+h2:y1, x1:x1+w1] = (img[y2+h2:y1, x1:x1+w1] + img[y1:y1+1, x1:x1+w1]) // 2 # 输出结果 cv2.imwrite('output.jpg', reconstructed) ``` 请注意,这只是一个简单的示例代码,实际应用中可能需要根据具体情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值