图像缩小算法

2023-11-23

您能帮我找到正确的图像调整大小算法吗?我有一个数字的图像。最大尺寸为 200x200,我需要获得尺寸为 15x15 甚至更小的图像。图像是单色的(黑白),结果应该是相同的。这就是关于我的任务的信息。

我已经尝试过一种算法,这里是

// xscale, yscale - decrease/increase rate
for (int f = 0; f<=49; f++)
            {
                    for (int g = 0; g<=49; g++)//49+1 - final size
                    {
                            xpos = (int)f * xscale;
                            ypos = (int)g * yscale;
                            picture3[f][g]=picture4[xpos][ypos];
                    }
            }

但它不适用于图像的缩小,这是我之前的目标。 你能帮我找到一个可以解决这个问题的算法吗(质量不一定是完美的,速度甚至不重要)。考虑到我是新手,有关它的一些信息也将是完美的。当然,一小段 c/c++ 代码(或库)也将是完美的。

编辑: 我找到了一个算法。适合从200压缩到20吗?


一般的方法是过滤输入以生成较小的尺寸,并使用阈值将其转换为单色。最容易实现的过滤器是简单的平均值,它通常会产生不错的结果。这正弦滤波器理论上是最好的,但实施起来不切实际,并且具有通常不受欢迎的振铃效应。还有许多其他过滤器可用,例如Lanczos或帐篷(这是双线性的广义形式)。

这是平均滤波器与阈值结合的版本。假设picture4是像素值为0或1的输入,输出是picture3以相同的格式。我还假设x是最不重要的维度,与通常的数学符号相反,并且与问题中的坐标相反。

int thumbwidth = 15;
int thumbheight = 15;
double xscale = (thumbwidth+0.0) / width;
double yscale = (thumbheight+0.0) / height;
double threshold = 0.5 / (xscale * yscale);
double yend = 0.0;
for (int f = 0; f < thumbheight; f++) // y on output
{
    double ystart = yend;
    yend = (f + 1) / yscale;
    if (yend >= height) yend = height - 0.000001;
    double xend = 0.0;
    for (int g = 0; g < thumbwidth; g++) // x on output
    {
        double xstart = xend;
        xend = (g + 1) / xscale;
        if (xend >= width) xend = width - 0.000001;
        double sum = 0.0;
        for (int y = (int)ystart; y <= (int)yend; ++y)
        {
            double yportion = 1.0;
            if (y == (int)ystart) yportion -= ystart - y;
            if (y == (int)yend) yportion -= y+1 - yend;
            for (int x = (int)xstart; x <= (int)xend; ++x)
            {
                double xportion = 1.0;
                if (x == (int)xstart) xportion -= xstart - x;
                if (x == (int)xend) xportion -= x+1 - xend;
                sum += picture4[y][x] * yportion * xportion;
            }
        }
        picture3[f][g] = (sum > threshold) ? 1 : 0;
    }
}

我现在已经测试了这段代码。下面是输入 200x200 图像,然后是最近邻缩小到 15x15(在 Paint Shop Pro 中完成),然后是此代码的结果。我会让你决定哪个更忠实于原作;如果原作有一些细节,差异会更加明显。

original nearest neighbor average+threshold

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

图像缩小算法 的相关文章

随机推荐

  • 无法运行 Android 模拟器,因为无法在 Windows 7 中初始化模拟的 FramebufferHAX

    我正在使用 Google 地图活动并添加了一些依赖项以在模拟器上显示地图 我收到以下错误 C Users root AppData Local Android sdk tools emulator exe netdelay none net
  • C++ OS X 打开默认浏览器

    我想知道一种从 C 应用程序打开 OS X 上的默认浏览器 然后打开请求的 URL 的方法 编辑 我这样解决了 system open http www apple com 如果您更喜欢使用本机 OS X API 而不是system ope
  • C++ 枚举类整数不适用于数组下标

    我有以下枚举类 enum class EnumClass int A 0 B 现在我想用该枚举类型为数组添加下标 MyObject arr 2 MyObject a arr EnumClass A MyObject b arr EnumCl
  • 使用子句中的 Delphi 条件编译

    我正在尝试修改我的 Delphi 2010 代码以在 XE7 中编译 并希望保留在 2010 中编译它的能力 因此 在容纳我的主窗体的单元中 我添加了条件指令 以下内容在 2010 年运行良好 uses IF CompilerVersion
  • Visual Studio 只在第二行汇编时中断?

    简短描述 在我的第一行设置断点 CODE汇编程序中的段不会停止程序的执行 问题 Visual Studio 的调试器会导致它无法在用汇编语言编写的程序的第一行创建断点吗 这是调试器的一些奇怪之处 是中断多字节指令的情况 还是我只是做了一些愚
  • Jupyter找不到keras的模块

    我已经安装了 Anaconda 的 Tensorflow 和 Keras 在 Windows 10 上 我创建了一个使用 Python 3 5 2 的环境 Anaconda 中的原始环境是 Python 3 6 当我尝试执行时import
  • Java - 包私有类内的方法可访问性?

    如果我有一个包私有的java类 用 类 声明 而不是 公共类 那么里面的方法声明为公共或受保护或包私有实际上没有区别 对吗 那么我应该使用哪个 或者什么时候应该使用哪个 我有点困惑 如果我有一个包私有的java类 用 类 声明 而不是 公共
  • 关闭 Snackbar 时 FloatingActionButton 不会下降

    我正在尝试使用Snackbar 我有一个FloatingActionButton包裹在一个CoordinatorLayout 当 的时候Snackbar显示 按钮已正确向上移动 当它自动关闭时 按钮向下移动 但如果我驳回Snackbar以编
  • 奇怪的空指针异常

    我的 NPE 的 Stacktrace 开头是 Caused by java lang NullPointerException at pl yourvision crm web servlets listExport ProductLis
  • Safari MacOS 异物在 svg 内无法正确缩放

    UPDTATE 由于 Apple 是一家价值 2 万亿美元的公司 让我们尝试通过在此处提交错误报告来让他们解决此问题 https www apple com feedback safari html In Chrome and Firefo
  • IntelliJ:将私钥设置为环境变量不起作用(Spring boot项目)

    我有一个 Spring Boot 项目 如果我使用私钥 多行文本 它工作得很好 这意味着密钥没有问题 但是当我尝试将其设置为 intellij 中的环境变量时 它显示 原因 属性 spring cloud config server git
  • 在另一个应用程序中向我自己的 ContentProvider 请求读取权限

    在一个应用程序中 我在 AndroidManifest 中声明了以下内容提供程序
  • 理解 git Cherry-pick

    来自 svn 背景 我几乎从不分支 因为切换速度 缺乏 以及将分支合并回主干需要一个小时或更长时间 有时 如果我需要修复网站上的问题 我会在主干中进行更改 它将与以前的更改或新功能一起存在 然后转到该文件并执行 svn up path to
  • 在 Perl 正则表达式替换中使用 $1 与 \1 有什么区别?

    我正在调试一些代码 想知道 Perl 正则表达式替换中的 1 和 1 之间是否有任何实际差异 例如 my package name Some Package ButNotThis package name s w w 1 print pac
  • 如何修复错误:此服务需要项目 ID,但无法确定

    我正在尝试从 AppEngine 将数据插入 Google 数据存储区 但收到错误 java lang IllegalArgumentException A project ID is required for this service b
  • numpy fromiter 与列表生成器

    import numpy as np def gen c c np ones 5 dtype int j 0 t 10 while j lt t c 0 j yield c tolist j 1 What I did res np arra
  • 使用选择查询更新表

    所以我在这里读了一些帖子 但我似乎无法在 MySQL 上运行它 几乎我有一个带有 itemid 的记录 计数 我想根据 itemid 更新到我的 items 表中 items popularity 这是我尝试过的 Update items
  • Bash 中命令替换的变量赋值的退出代码

    我对明确执行变量赋值并使用命令替换时命令将返回什么错误代码感到困惑 a false echo 它输出1 这让我认为变量赋值不会清除最后一个错误代码或产生新的错误代码 但是当我尝试这个时 false a echo 它输出0 显然这就是a 返回
  • 有人使用 Swing 的“swingx”扩展吗? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 我在这里看到了 swingx 的提及和提及 但是 每次
  • 图像缩小算法

    您能帮我找到正确的图像调整大小算法吗 我有一个数字的图像 最大尺寸为 200x200 我需要获得尺寸为 15x15 甚至更小的图像 图像是单色的 黑白 结果应该是相同的 这就是关于我的任务的信息 我已经尝试过一种算法 这里是 xscale