You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何实现像素位置反转?圆形区域像素映射技术求助

目标

我希望编写一个程序,将图像中的某一区域映射到同一图像的另一区域。例如,若图像中有一个圆形区域,我想要将圆周上的每个像素映射到区域外的位置,可以通过将像素位置乘以某个整数来实现。这类似于给气球充气时表面膨胀的效果,我要将选定圆形区域表面的所有像素移动到图像中的其他位置。

已实现代码及效果

我先从简单的矩形区域像素映射入手,编写了如下代码:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.27 15:02:47