首页 > 编程语言 >图像缩放算法双线性插值法

图像缩放算法双线性插值法

时间:2024-03-27 09:01:51浏览次数:31  
标签:缩放 插值法 float 像素 int 原始 双线性 图像

双线性插值法是一种常用的图像缩放算法,它可以通过对原始图像中的像素进行加权平均来计算目标图像中的像素值。相比最近邻插值,双线性插值可以更准确地估计像素之间的灰度值。

具体实现步骤如下:

  1. 计算目标图像与原始图像的尺寸比例关系,即缩放因子。缩放因子可以根据目标图像的宽度和高度与原始图像的宽度和高度之间的比值来计算。

    缩放因子(Scale Factor) = 目标图像尺寸 / 原始图像尺寸

  2. 遍历目标图像的每个像素,根据缩放因子计算出对应的原始图像上最近的四个像素的坐标。

    原始图像坐标 = 目标图像坐标 / 缩放因子

  3. 对于每个目标图像像素,计算其在原始图像上的四个最近像素的灰度值和权重,并使用加权平均的方法计算目标像素的灰度值。

    • 计算水平方向上的权重(x 方向): w1 = 目标图像坐标的小数部分 w0 = 1 - w1

    • 计算垂直方向上的权重(y 方向): w3 = 目标图像坐标的小数部分 w2 = 1 - w3

    • 对四个最近像素的灰度值进行加权平均: 目标像素值 = w0 * (w2 * 原始图像左上像素 + w3 * 原始图像左下像素) + w1 * (w2 * 原始图像右上像素 + w3 * 原始图像右下像素)

  4. 重复步骤 2 和步骤 3,遍历所有目标图像像素,计算它们在原始图像上的对应像素及其灰度值,并赋给目标图像。

双线性插值法能够更好地保留图像的细节信息,减少锯齿状伪像的产生。以下是一个简化的示例代码,展示了双线性插值算法的实现:

#include <iostream>
#include <cmath>

// 双线性插值算法
void bilinearInterpolation(const unsigned char* srcImage, int srcWidth, int srcHeight,
                           unsigned char* dstImage, int dstWidth, int dstHeight) {
    float scaleX = static_cast<float>(srcWidth) / dstWidth;
    float scaleY = static_cast<float>(srcHeight) / dstHeight;

    for (int y = 0; y < dstHeight; ++y) {
        for (int x = 0; x < dstWidth; ++x) {
            float srcX = x * scaleX;
            float srcY = y * scaleY;

            int x1 = floor(srcX);
            int y1 = floor(srcY);
            int x2 = ceil(srcX);
            int y2 = ceil(srcY);

            float dx = srcX - x1;
            float dy = srcY - y1;

            int srcIndex1 = y1 * srcWidth + x1;
            int srcIndex2 = y1 * srcWidth + x2;
            int srcIndex3 = y2 * srcWidth + x1;
            int srcIndex4 = y2 * srcWidth + x2;
            int dstIndex = y * dstWidth + x;

            float w0 = (1 - dx) * (1 - dy);
            float w1 = dx * (1 - dy);
            float w2 = (1 - dx) * dy;
            float w3 = dx * dy;

            dstImage[dstIndex] = w0 * srcImage[srcIndex1] +
                                 w1 * srcImage[srcIndex2] +
                                 w2 * srcImage[srcIndex3] +
                                 w3 * srcImage[srcIndex4];
        }
    }
}

int main() {
    // 原始图像尺寸和数据
    int srcWidth = 4;
    int srcHeight = 4;
    unsigned char srcImage[] = {
        1, 2, 3, 4,
        5, 6, 7, 8,
        9, 10, 11, 12,
        13, 14, 15, 16
    };

    // 目标图像尺寸和数据
    int dstWidth = 8;
    int dstHeight = 8;
    unsigned char dstImage[64];

    // 使用双线性插值算法进行图像缩放
    bilinearInterpolation(srcImage, srcWidth, srcHeight, dstImage, dstWidth, dstHeight);

    // 输出目标图像像素值
    for (int y = 0; y < dstHeight; ++y) {
        for (int x = 0; x < dstWidth; ++x) {
            std::cout << static_cast<int>(dstImage[y * dstWidth + x]) << " ";
        }
        std::cout << std::endl;
    }

    return 0;
}

该示例中,我们首先定义了一个4x4的原始图像和一个8x8的目标图像。然后使用双线性插值算法对原始图像进行缩放,得到目标图像。最后输出目标图像的像素值。

同样地,实际的图像缩放可能还涉及边界处理、图像通道数等更复杂的情况。建议在实际应用中使用现有的图像处理库或函数来实现图像缩放操作。

标签:缩放,插值法,float,像素,int,原始,双线性,图像
From: https://blog.csdn.net/wangjiaweiwei/article/details/131924374

相关文章

  • element 文本域设置 隐藏边框,禁止缩放,自动换行...
    1.隐藏边框:deep(.el-textarea__inner){box-shadow:0000px;}:deep(.el-textarea__inner:hover){box-shadow:0000px;}:deep(.el-textarea__inner:focus){box-shadow:0000px;} 2.禁止缩放resize="none"3.自动换行 autosizeminRows:5......
  • Three.js 中的 OrbitControls 是一个用于控制相机围绕目标旋转以及缩放、平移等操作的
    demo案例Three.js中的OrbitControls是一个用于控制相机围绕目标旋转以及缩放、平移等操作的控制器。下面是它的详细讲解:构造函数:OrbitControls(object:Camera,domElement?:HTMLElement)object:THREE.Camera实例,控制器将围绕此对象进行操作,例如相机。domElement......
  • 可视化学习:WebGL实现缩放平移
    前言在上篇文章中,我们使用WebGL实现了网格背景,当时有提到说使用WebGL来实现的好处之一,是网格背景可以与画布上的其他元素更好地融合,比如一起缩放平移,那么在WebGL中怎么实现缩放和平移呢?现在我们已经实现了网格背景,接下来我们就用网格背景作为例子来了解一下WebGL中的缩放和平移。......
  • echarts实践总结(常用一):柱状图(特点:渐变色、点击缩放、左右滑动、悬浮展示样式)
    目录第一章echarts基本使用第二章echarts实践——柱状图效果展示第一章echarts基本使用Echarts常用配置项(详细入门)_echarts配置项手册-CSDN博客第二章echarts实践——柱状图最近接到这么一个需求,需要画页面,然后有这么几个echarts的图需要画,平常我们通过教程......
  • 图片超过容器溢出的几种解决方法(实现图片缩放)
    网页插入图片的两种常见应用场景在网页编写,我们经常会插入图片来优化网页整体结构,增强用户体验感,在插入图片时,我们会有两种比较常见的应用场景,一种就是使用background-image属性插入背景图片,还有一种是使用img标签插入图片。使用background-image属性插入背景图片当插入......
  • QT 自定义QGraphicsItem 缩放后旋转 图形出现漂移问题
    实现自定义QGraphicsItem缩放和旋转时,遇到了这样一个问题:将item旋转一个角度,然后拖拽放大,再次进行旋转时图像会发生漂移。原本以为是放大后中心点位置没有改变,导致旋转时以原中心的旋转出现了偏移,但是重新设置旋转中心setTransformOriginPoint(rect.center());并没有起作用,图像......
  • 微信小程序开发:调用人像动漫化接口前先限制并缩放图片尺寸
    上文说到我们在调用人像动漫化接口之前先将人像图片做了增强,但是用户自己上传的图片可能像素会很大,会超过2000*2000,因为人像动漫化接口限制,图片大小不能超过2000*2000: 只有阿里云有这个限制,腾讯云的限制是图片大小不能超过5M: 只有阿里云的有限制: 所以我们需要用到......
  • C# 等比例缩放图片
    ///<summary>///等比例缩放图片///</summary>///<paramname="bitmap">图片</param>///<paramname="destHeight">高度</param>///<paramname="destWidth">宽度</param>///<returns>&l......
  • powerpoint:缩放定位动画
    一,幻灯片缩放定位插入->缩放定位->幻灯片缩放定位:在弹出窗口中,选中目标幻灯片,然后点插入按钮:插入成功:放映时退出:按键盘上的向上箭头或点击幻灯片底部的向上箭头,即可回到原幻灯片页面,如按空格或向右键箭头,则会按目标幻灯片所在位置向后播放:说明:刘宏缔的架构森林......
  • 调整window下qt界面的缩放比例为自适应
    原因:QtCreator的缩放策略是四舍五入,只能缩放到1或2,而不是1.5,就比如系统缩放为150%,qt界面则会被缩放为200%解决办法:Linux下:exportQT_SCALE_FACTOR_ROUNDING_POLICY=PassThrough1.这行代码是环境变量设置的一部分,用于指定QT应用程序的缩放因子舍入策略。QT_SCALE_FACTOR......