将图像绕一个圆圈

2024-02-16

在这个例子中我想做的是将图像包裹在一个圆圈上,如下所示。

为了包装图像,我简单地使用 trig 计算了 x,y 坐标。 问题是计算出的 X 和 Y 位置被四舍五入以使其成为整数。这会导致上面的包裹图像中出现空白像素。 x,y 位置必须是整数,因为它们是列表中的位置。

我在下面的代码中再次执行了此操作,但没有任何图像以使事情更容易查看。我所做的就是创建两个具有二进制值的数组,一个数组是黑色的,另一个是白色的,然后将一个数组包裹在另一个数组上。

代码的输出是。

import math as m
from PIL import Image  # only used for showing output as image

width = 254.0
height = 24.0
Ro = 40.0

img = [[1 for x in range(int(width))] for y in range(int(height))]
cir = [[0 for x in range(int(Ro * 2))] for y in range(int(Ro * 2))]


def shom_im(img):  # for showing data as image
    list_image = [item for sublist in img for item in sublist]
    new_image = Image.new("1", (len(img[0]), len(img)))
    new_image.putdata(list_image)
    new_image.show()

increment = m.radians(360 / width)
rad = Ro - 0.5
for i, row in enumerate(img):
    hyp = rad - i
    for j, column in enumerate(row):
        alpha = j * increment
        x = m.cos(alpha) * hyp + rad
        y = m.sin(alpha) * hyp + rad
        # put value from original image to its position in new image
        cir[int(round(y))][int(round(x))] = img[i][j]


shom_im(cir)

我后来发现了中点圆算法,但结果更糟

from PIL import Image  # only used for showing output as image

width, height = 254, 24
ro = 40

img = [[(0, 0, 0, 1) for x in range(int(width))]
       for y in range(int(height))]
cir = [[(0, 0, 0, 255) for x in range(int(ro * 2))] for y in range(int(ro * 2))]


def shom_im(img):  # for showing data as image
    list_image = [item for sublist in img for item in sublist]
    new_image = Image.new("RGBA", (len(img[0]), len(img)))
    new_image.putdata(list_image)
    new_image.show()


def putpixel(x0, y0):
    global cir
    cir[y0][x0] = (255, 255, 255, 255)


def drawcircle(x0, y0, radius):
    x = radius
    y = 0
    err = 0

    while (x >= y):
        putpixel(x0 + x, y0 + y)
        putpixel(x0 + y, y0 + x)
        putpixel(x0 - y, y0 + x)
        putpixel(x0 - x, y0 + y)
        putpixel(x0 - x, y0 - y)
        putpixel(x0 - y, y0 - x)
        putpixel(x0 + y, y0 - x)
        putpixel(x0 + x, y0 - y)
        y += 1
        err += 1 + 2 * y
        if (2 * (err - x) + 1 > 0):
            x -= 1
            err += 1 - 2 * x

for i, row in enumerate(img):
    rad = ro - i
    drawcircle(int(ro - 1), int(ro - 1), rad)

shom_im(cir)

有人能建议一种消除空白像素的方法吗?


你在充实自己的圈子时遇到了问题,因为你以错误的方式处理这个问题——毫不夸张地说。

测绘时from来源to一个目标,你需要填写你的target,并将每个翻译后的像素映射到source图像。这样,您就不可能错过任何一个像素,同样,您也不会多次绘制(或查找)一个像素。

以下内容有点粗略,仅作为概念示例。我首先编写了一些代码来从上到下绘制一个实心圆。然后我添加了更多代码来删除中心部分(并添加了一个变量Ri,表示“内半径”)。这会形成一个实心环,其中所有像素仅绘制一次:从上到下,从左到右。

实际上如何绘制戒指并不重要!我一开始使用三角函数是因为我想重新使用角度位,但它也可以用毕达哥拉斯函数来完成,甚至可以用布雷森汉姆的圆例程来完成。您需要记住的只是迭代target行和列,而不是source。这提供了实际的x,y您可以将其输入到重新映射过程中的坐标。

完成上述工作后,我编写了要翻译的三角函数from我要放置像素的坐标into原始图像。为此,我创建了一个包含一些文本的测试图像:

这也是一件好事,因为在第一次尝试中,我得到了两次文本(一次向左,一次向右)并镜像 - 这需要一些小的调整。另请注意背景网格。我添加它是为了检查“顶部”和“底部”线(最外层和最内层的圆圈)是否正确绘制。

使用此图像运行我的代码并Ro,Ri在 100 和 50 处,我得到这个结果:

您可以看到三角函数使其从最右边的点开始,顺时针移动,并使图像的顶部指向外侧。所有这些都可以进行简单的调整,但这样它会模仿您想要绘制图像的方向。

这是虹膜图像的结果,使用33对于内半径:

这是一个很好的动画,显示了映射的稳定性:

最后,我的代码是:

import math as m
from PIL import Image

Ro = 100.0
Ri = 50.0

# img = [[1 for x in range(int(width))] for y in range(int(height))]
cir = [[0 for x in range(int(Ro * 2))] for y in range(int(Ro * 2))]

# image = Image.open('0vWEI.png')
image = Image.open('this-is-a-test.png')
# data = image.convert('RGB')
pixels = image.load()
width, height = image.size

def shom_im(img):  # for showing data as image
    list_image = [item for sublist in img for item in sublist]
    new_image = Image.new("RGB", (len(img[0]), len(img)))
    new_image.putdata(list_image)
    new_image.save("result1.png","PNG")
    new_image.show()


for i in range(int(Ro)):
    # outer_radius = Ro*m.cos(m.asin(i/Ro))
    outer_radius = m.sqrt(Ro*Ro - i*i)
    for j in range(-int(outer_radius),int(outer_radius)):
        if i < Ri:
            # inner_radius = Ri*m.cos(m.asin(i/Ri))
            inner_radius = m.sqrt(Ri*Ri - i*i)
        else:
            inner_radius = -1
        if j < -inner_radius or j > inner_radius:
            # this is the destination
            # solid:
            # cir[int(Ro-i)][int(Ro+j)] = (255,255,255)
            # cir[int(Ro+i)][int(Ro+j)] = (255,255,255)
            # textured:

            x = Ro+j
            y = Ro-i
            # calculate source
            angle = m.atan2(y-Ro,x-Ro)/2
            distance = m.sqrt((y-Ro)*(y-Ro) + (x-Ro)*(x-Ro))
            distance = m.floor((distance-Ri+1)*(height-1)/(Ro-Ri))
        #   if distance >= height:
        #       distance = height-1
            cir[int(y)][int(x)] = pixels[int(width*angle/m.pi) % width, height-distance-1]
            y = Ro+i
            # calculate source
            angle = m.atan2(y-Ro,x-Ro)/2
            distance = m.sqrt((y-Ro)*(y-Ro) + (x-Ro)*(x-Ro))
            distance = m.floor((distance-Ri+1)*(height-1)/(Ro-Ri))
        #   if distance >= height:
        #       distance = height-1
            cir[int(y)][int(x)] = pixels[int(width*angle/m.pi) % width, height-distance-1]

shom_im(cir)

注释掉的线画出一个实心的白色环。请注意此处和那里的各种调整以获得最佳结果。例如,distance是从环的中心开始测量的,因此对于靠近中心的位置返回较低的值,对于圆的外部则返回最大值。将其直接映射回目标图像将显示文本,其顶部“向内”,指向内孔。所以我反转了这个映射height - distance - 1,其中-1是让它映射自0 to height again.

类似的修复是在计算中distance本身;无需调整Ri+1 and height-1最内层或最外层的行都不会被绘制,这表明计算仅相差一个像素(这正是该网格的目的)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将图像绕一个圆圈 的相关文章

  • 检查 Python 中的可迭代对象中的所有元素的谓词是否计算为 true

    我很确定有一个常见的习语 但我无法通过谷歌搜索找到它 这是我想做的 用Java Applies the predicate to all elements of the iterable and returns true if all ev
  • Python 中的流式传输管道

    我正在尝试使用 Python 将 vmstat 的输出转换为 CSV 文件 因此我使用类似的方法转换为 CSV 并将日期和时间添加为列 vmstat 5 python myscript py gt gt vmstat log 我遇到的问题是
  • sklearn 中的 pca.inverse_transform

    将我的数据拟合后 X 我的数据 pca PCA n components 1 pca fit X X pca pca fit transform X 现在 X pca 具有一维 当我根据定义执行逆变换时 它不是应该返回原始数据 即 X 二维
  • Pandas:如果单元格包含特定文本则删除行

    pandas 中的这段代码不起作用 如果该列包含提供的任何文本 数字 我希望它删除该行 目前 我只能在单元格与我的代码中传递的确切文本匹配时才能使其工作 因为它只删除显示 Fin 的单元格不是金融或金融 df2 df df Team Fin
  • 结构差异 sudo() run('sudo 命令')

    我想知道函数之间有什么区别sudo 和函数run sudo u user smth 文档上有 sudo 在所有运行方式上都是相同的 除了它总是换行 调用 sudo 程序中的给定命令以提供超级用户 特权 但有几次 sudo cmd 提示我输入
  • 在 Windows 上使用 apache mod_wsgi 运行 Flask 应用程序时导入冲突

    我允许您询问我在 Windows 上使用您的 mod wsgi portage 托管 Flask 应用程序时遇到的问题 我有两个烧瓶应用程序 由于导入冲突 只有一个可以同时存在 IE 如果请求申请 1 我有回复 然后 如果我请求应用程序 2
  • 通过索引访问Python字典的元素

    考虑一个像这样的字典 mydict Apple American 16 Mexican 10 Chinese 5 Grapes Arabian 25 Indian 20 例如 我如何访问该字典的特定元素 例如 我想在对 Apple 的第一个
  • Matplotlib 中 x 轴标签的频率和旋转

    我在下面编写了一个简单的脚本来使用 matplotlib 生成图形 我想将 x tick 频率从每月增加到每周并轮换标签 我不知道从哪里开始 x 轴频率 我的旋转线产生错误 TypeError set xticks got an unexp
  • 用 python 编写的数学语法检查器

    我需要的只是使用 python 检查字符串是否是有效的数学表达式 为了简单起见 假设我只需要 运算符 也作为一元 带有数字和嵌套括号 为了完整性 我还添加了简单的变量名称 所以我可以这样测试 test 3 2 1 valid test 3
  • Jython 和 SAX 解析器:允许的实体不超过 64000 个?

    我做了一个简单的测试xml saxJython 中的解析器在处理大型 XML 文件 800 MB 时遇到以下错误 Traceback most recent call last File src project xmltools py li
  • 使用 Keras np_utils.to_categorical 的问题

    我正在尝试将整数的 one hot 向量数组制作为 keras 将能够使用的 one hot 向量数组来拟合我的模型 这是代码的相关部分 Y train np hstack np asarray dataframe output vecto
  • 将seaborn.palplot轴添加到现有图形中以可视化不同调色板

    将seaborn人物添加到子图中是usually https seaborn pydata org examples cubehelix palette html创建图形时通过传递 ax 来完成 例如 sns kdeplot x y cma
  • 在 keras 中保存和加载权重

    我试图从我训练过的模型中保存和加载权重 我用来保存模型的代码是 TensorBoard log dir output model fit generator image a b gen batch size steps per epoch
  • 连接mysql和python.3

    我是 django 的新手 使用 django 1 5 和 python 3 3 有没有办法在 python 3 3 上安装 mysqlDB 或 有其他方法可以连接它们吗 PyMySQL https github com petehunt
  • Anaconda 无法导入 ssl 但 Python 可以

    Anaconda 3 Jupyter笔记本无法导入ssl 但使用Atom终端导入ssl没有问题 我尝试在 Jupyter 笔记本中导入 ssl 但出现以下错误 C ProgramData Anaconda3 lib ssl py in
  • SocketIO + Flask 检测断开连接

    我在这里有一个不同的问题 但意识到它可以简化为 如何检测客户端何时从页面断开连接 关闭其页面或单击链接 换句话说 套接字连接关闭 我想制作一个带有更新用户列表的聊天应用程序 并且我在 Python 上使用 Flask 当用户连接时 浏览器发
  • 从 NumPy 数组到 Mat 的 C++ 转换 (OpenCV)

    我正在围绕 ArUco 增强现实库 基于 OpenCV 编写一个薄包装器 我试图构建的界面非常简单 Python 将图像传递给 C 代码 C 代码检测标记并将其位置和其他信息作为字典元组返回给 Python 但是 我不知道如何在 Pytho
  • 在 Django 查询中使用 .extra(select={...}) 引入的值上使用 .aggregate() ?

    我正在尝试计算玩家每周玩游戏的次数 如下所示 player game objects extra select week WEEK games game date aggregate count Count week 但姜戈抱怨说 Fiel
  • python 线程安全可变对象复制

    Is 蟒蛇的copy http docs python org 2 library copy html模块线程安全吗 如果不是 我应该如何在 python 中以线程安全的方式复制 deepcopy 可变对象 蟒蛇的GIL http en w
  • 将上下文管理器的动态可迭代链接到单个 with 语句

    我有一堆想要链接的上下文管理器 第一眼看上去 contextlib nested看起来是一个合适的解决方案 但是 此方法在文档中被标记为已弃用 该文档还指出最新的with声明直接允许这样做 自 2 7 版起已弃用 with 语句现在支持此

随机推荐

  • NSView 初始化:-init: 与 -awakeFromNib:

    我有一个简单的课程MyView继承自NSView和实例变量NSImage image 在里面 类的功能是在视图上绘制图像 然而 在 drawRect 图像实例始终相等nil 如果它是在 init 功能而不是nil如果它是在 awakeFro
  • 通过 TCP 传输程序集

    我目前正在尝试通过 TCP 连接发送序列化对象 如下所示 BinaryFormatter formatter new BinaryFormatter formatter Serialize clientStream Object Assem
  • 如何反汇编正在运行的linux内核?

    寻找一种反汇编正在运行的内核的方法 我可以通过 dev kmem 来实现吗 我运行的是linux 2 6 32 或者我可以使用内核模块来运行内核吗 我是初学者 请帮忙 我想做的就是通过查看是否出现某些特定指令来检查内核映像中是否存在某些恶意
  • MediaStyle 通知:播放/暂停按钮不响应单击

    在我的应用程序中 当用户选择要播放的音频文件时 当文件准备好并且播放开始时 会成功显示 MediaStyle 通知 元数据信息已更新 标题 图标等 但是 1 Play Pause button does not respond to cli
  • 在 PyCharm 中调试 asyncio 代码会导致绝对疯狂的不可重复错误

    在我的基于使用 PyCharm 调试器进行调试的 asyncio 和 asyncio tcp 连接的项目中 我遇到了非常非常荒谬的错误 如果我在运行后在代码上放置断点 则断点永远不会触发 但是如果在启动程序之前设置了断点 则会触发断点 但在
  • Select2 下拉更改事件不起作用

    我在用Select2下拉菜单 我需要根据下拉菜单选择执行一些功能 我尝试过以下代码 但它对我不起作用 eventSelect on select2 select function e log select2 select e eventSe
  • 结构体中的指针和值有什么区别?

    给定以下结构 type Exp struct foo int bar int 在结构中使用指针或值时 性能有何区别 是否有任何开销或者这只是 Go 编程的两个流派 我会使用指针来实现链式结构 但这是否是我们必须在结构中使用指针以获得性能的唯
  • jQuery - SlideToggle() 和切换文本

    我有一个可以使用隐藏的联系表 slideToggle 但我希望该选项卡用于Toggle根据表单是否更改文本的表单in view or hidden 这是 jQuery slider click function form wrap anim
  • 如何将 SQLSRV 扩展安装到 php XAMPP

    I m trying to install a SQLSRV extension My PHP version is 7 2 XAMPP 3 2 2 and I use windows 10 I downloaded the dll fro
  • myisam_sort_buffer_size 与 sort_buffer_size

    我的服务器是 MySQL 内存为 6GB 我需要知道 myisam sort buffer size 和 sort buffer size 之间有什么区别 我为它们设置了以下尺寸 myisam sort buffer size 8M 排序缓
  • 错误:找不到Python模块tensorflow.python.keras

    我想将一些数值转换为类别 我正在使用 keras 包进行图像分类 当我使用 to categorical trainy 时 收到 错误 未找到 Python 模块tensorflow python keras 我已经采取了 trainy l
  • Firebase - 对多个节点进行更新/扇出时设置优先级

    我正在一次更新中写入 Firebase 数据库的多个部分 节点 这样做时是否可以设置节点的优先级 例子 firebaseRef update some node value some other node other value 如果我想同
  • 使用 Gluon 移动环境时如何在运行时请求权限?

    我是新来的 因此我还不知道该网站的所有规则 对此感到抱歉 我正在使用 Eclipse 工具中的 Gluon 移动插件构建桌面和 Android 的 Java 应用程序 我有针对桌面和 Android 的不同代码 如示例中所述 http do
  • PyCharm 使用 Mypy 吗?

    PyCharm 使用 Mypy 还是 JetBrains 实现PEP 484 https www python org dev peps pep 0484 分别地 看来他们采用了自己的实现方式 https github com python
  • Django - 重写 Model.create() 方法?

    The Django 文档 http docs djangoproject com en dev topics db models overriding predefined model methods仅列出覆盖的示例save and de
  • 在 RHEL 6.5 上安装 RPostgreSQL libpq-fe.h 错误

    我有 RHEL 6 5 服务器 安装了 R 3 1 1 和 RStudioServer 0 98 1062 我安装了 postgresql 9 3 并处理一个大型数据库 为了将 R 连接到 PostgreSQL 我过去使用过 RPostgr
  • 通过 python/JS 发送 Whatsapp 消息

    我编写了一个程序 它从 excel 获取信息并通过 python 发送消息 我使用 selenium 和 span 来查找我需要的元素 现在 WhatsApp 更改了 HTML 不再有跨度 旧代码在这里 import time import
  • HTML 中
    标签的使用:版权还是网站管理员?

    在我客户网站的页脚上有他的地址和版权声明 下面是网站管理员的地址 对于两者 我将使用 hCard 微格式 我应该使用其中的哪一个
  • 将 netCDF 文件转换为 csv

    我正在努力将几个 Berkeley Earth netCDF 文件转换为 CSV 或其他表格格式 我意识到以前曾提出过类似的问题 但我无法应用我遇到的任何解决方案 例如 这个数据集 http berkeleyearth lbl gov au
  • 将图像绕一个圆圈

    在这个例子中我想做的是将图像包裹在一个圆圈上 如下所示 为了包装图像 我简单地使用 trig 计算了 x y 坐标 问题是计算出的 X 和 Y 位置被四舍五入以使其成为整数 这会导致上面的包裹图像中出现空白像素 x y 位置必须是整数 因为