如何实现像素位置反转?圆形区域像素映射技术求助
目标
我希望编写一个程序,将图像中的某一区域映射到同一图像的另一区域。例如,若图像中有一个圆形区域,我想要将圆周上的每个像素映射到区域外的位置,可以通过将像素位置乘以某个整数来实现。这类似于给气球充气时表面膨胀的效果,我要将选定圆形区域表面的所有像素移动到图像中的其他位置。
已实现代码及效果
我先从简单的矩形区域像素映射入手,编写了如下代码:
from PIL import Image import math import numpy as np im = Image.open("gala.png") width, _ = im.size # 待映射图像区域的宽度值 for t in np.arange(0,420): xmin=int(115+t) xmax=xmin+1 for i in np.arange(xmin, xmax): def getpixels(yaxis): pixels=[] for j in range(yaxis, yaxis+50):# 与yaxis相加的值为待映射图像区域的高度 r, g, b = im.getpixel((i,j)) pixels.append((r,g,b)) return pixels def replacepixels(yaxis,pixels): index=0 for j in range(yaxis,yaxis+50): im.putpixel((i,j),pixels[index]) index=index+1 def doalljob(yaxis1,yaxis2): firstpart=getpixels(yaxis1) secondpart=getpixels(yaxis2) replacepixels(yaxis2,firstpart) # 指定像素在y轴上的目标位置 doalljob(50,220) im.show()
原始图像
之后我进一步实现了区域内逐像素的映射,代码如下:
from PIL import Image import math from PIL import Image, ImageDraw, ImageFilter import numpy as np import cv2 im = Image.open("gala1.png") width, _ = im.size # 待映射图像区域的宽度值 for t in range(210,420): xmin=115+int(t) xmax=xmin+1 for i in range(xmin, xmax): def getpixels(yaxis): pixels=[] for j in range(yaxis, yaxis+50):# 与yaxis相加的值为待映射图像区域的高度 r, g, b = im.getpixel((i,j)) pixels.append((r,g,b)) return pixels def replacepixels(yaxis,pixels): index=0 for j in range(yaxis,yaxis+50): im.putpixel((i,j),pixels[index]) index=index+1 def doalljob(yaxis1,yaxis2): firstpart=getpixels(yaxis1) secondpart=getpixels(yaxis2) replacepixels(yaxis2,firstpart) # 指定像素在y轴上的目标位置 j=int(((t-210)/29)**(5/2)) doalljob(50,j+130) for tk in range(0,210): xmin=115+int(tk) xmax=xmin+1 for i in range(xmin, xmax): def getpixels(yaxis): pixels=[] for j in range(yaxis, yaxis+50):# 与yaxis相加的值为待映射图像区域的高度 r, g, b = im.getpixel((i,j)) pixels.append((r,g,b)) return pixels def replacepixels(yaxis,pixels): index=0 for j in range(yaxis,yaxis+50): im.putpixel((i,j),pixels[index]) index=index+1 def doalljob(yaxis1,yaxis2): firstpart=getpixels(yaxis1) secondpart=getpixels(yaxis2) replacepixels(yaxis2,firstpart) # 指定像素在y轴上的目标位置 j=int(((210-tk)/29)**(5/2)) doalljob(50,j+130) im.show()
第一段代码运行后得到如下图像:
第一段代码运行结果
第二段代码运行后得到如下图像:
第二段代码运行结果
上述两种情况均达到了预期效果。
当前技术难题
我现在的核心需求是实现圆形区域的像素映射,但尝试使用圆的方程来选择圆形区域时,结果混乱,特此寻求可行的解决方案。
感谢帮助!
内容的提问来源于stack exchange,提问作者user22785665
相关产品推荐
相关产品推荐

