数字图像处理(十三)图像放大及双线性插值算法

这篇具有很好参考价值的文章主要介绍了数字图像处理(十三)图像放大及双线性插值算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

导言

图像放大是日常学习中经常要用到的两个算法,我们首先讨论缩放的流程以及放大时如何优化双线性插值算法。
采用国际标准测试图像Lena,为了方便,我们将读入的彩色图转为灰度图进行缩放。

图像放大

和图像缩小不同,图像放大是小数据量到大数据量的处理过程,因此需要对许多未知的数据进行估计。
如果一幅 W × H W\times H W×H图像要放大 k 1 × k 2 k_1 \times k_2 k1×k2(即行放大 k 1 k_1 k1倍,列放大 k 1 k_1 k1倍),则放大后的图像大小为 i n t ( W ∗ k 1 ) × i n t ( H ∗ k 1 ) int(W*k_1)\times int(H*k_1) int(Wk1)×int(Hk1),这里取int的原因是乘出来的的数值可能为小数。
具体过程如下图所示:
我们有一个图像大小为4*4,每一个像素值都是1。
双线性插值法图像放大,数字图像处理,算法,计算机视觉,图像处理

它的坐标矩阵如下所示
双线性插值法图像放大,数字图像处理,算法,计算机视觉,图像处理

现在我们将原图(下面称为f)的行和列都放大1.5倍( k 1 = 1.5 k_1=1.5 k1=1.5 k 2 = 1.5 k_2=1.5 k2=1.5)。则放大后的图像(下面称为g)的 widht=6= 4 × 1.5 4\times1.5 4×1.5,height=6= 4 × 1.5 4\times1.5 4×1.5。接着我们要计算g中的坐标在f中映射。如下图所示:
双线性插值法图像放大,数字图像处理,算法,计算机视觉,图像处理
我们计算出g中的(0,1)点应该对应f中的(0,0.67)点,但是f中无此坐标,所有我们使用线性插值法来计算(0,0.67)处的像素值。
线性插值法如果你没有了解过,建议先去了解一下。
线性插值法的通用公式如下:
f ( x 2 ) − f ( x 1 ) x 2 − x 1 = f ( x ) − f ( x 1 ) x − x 1 \frac{f(x_2)-f(x_1)}{x_2-x_1}=\frac{f(x)-f(x_1)}{x-x_1} x2x1f(x2)f(x1)=xx1f(x)f(x1)
f ( x ) = x 2 − x x 2 − x 1 f ( x 1 ) + x − x 1 x 2 − x 1 f ( x 2 ) f(x)=\frac{x_2-x}{x_2-x_1}f(x_1)+\frac{x-x_1}{x_2-x_1}f(x_2) f(x)=x2x1x2xf(x1)+x2x1xx1f(x2)
上面的第二个公式就是权重公式。
所以 f ( 0 , 0.67 ) = 1 − 0.67 1 − 0 f ( 0 , 0 ) + 0.67 − 0 1 − 0 f ( 0 , 1 ) = 1 f(0,0.67)=\frac{1-0.67}{1-0}f(0,0)+\frac{0.67-0}{1-0}f(0,1)=1 f(0,0.67)=1010.67f(0,0)+100.670f(0,1)=1
我们再举一个列子:
双线性插值法图像放大,数字图像处理,算法,计算机视觉,图像处理
注意到此时计算出的x为1.3,在1和2之间;y为2.67,在2和3之间。所以我们要通过双线性插值来计算(1.3,2.67)坐标处的像素值。双线性插值算法如下图。
双线性插值法图像放大,数字图像处理,算法,计算机视觉,图像处理
具体就是先对 Q 11 Q_{11} Q11 Q 21 Q_{21} Q21进行线性插值,计算出 R 1 R_1 R1,然后对 Q 12 Q_{12} Q12 Q 22 Q_{22} Q22进行线性插值,计算出 R 2 R_2 R2,最后对 R 2 R_2 R2 R 1 R_1 R1进行插值,计算出我们想要的坐标 P P P的值。
f ( 1.3 , 2 ) = ( 2 − 1.3 ) f ( 2 , 2 ) + ( 1.3 − 1 ) f ( 1 , 2 ) = 1 f(1.3,2)=(2-1.3)f(2,2)+(1.3-1)f(1,2)=1 f(1.3,2)=(21.3)f(2,2)+(1.31)f(1,2)=1
f ( 1.3 , 3 ) = ( 2 − 1.3 ) f ( 2 , 3 ) + ( 1.3 − 1 ) f ( 1 , 3 ) = 1 f(1.3,3)=(2-1.3)f(2,3)+(1.3-1)f(1,3)=1 f(1.3,3)=(21.3)f(2,3)+(1.31)f(1,3)=1
我们对(1.3,2)和(1.3,3)进行线性插值。
f ( 1.3 , 2.67 ) = ( 3 − 2.67 ) f ( 1.3 , 2 ) + ( 2.67 − 2 ) f ( 1.3 , 3 ) = 1 f(1.3,2.67)=(3-2.67)f(1.3,2)+(2.67-2)f(1.3,3)=1 f(1.3,2.67)=(32.67)f(1.3,2)+(2.672)f(1.3,3)=1
所以根据双线性插值计算出来的(1.3,2.37)处的像素值为1。

总而言之,如果计算出的点在f中是边缘点,则使用单线性插值,如果不是边缘点,则使用双线性插值。
C++代码如下:文章来源地址https://www.toymoban.com/news/detail-743780.html

int main()
{
    cv::Mat image = cv::imread("LenaRGB.bmp");
    //Using gray image for easy calculations
    cv::Mat grayImage(image.size(), CV_8UC1);
    cv::cvtColor(image, grayImage, CV_BGR2GRAY);
    
    int width = grayImage.cols;
    int height = grayImage.rows;

    // Scale factor
    double k1 = 1.4;
    double k2 = 1.7;
    //Create zero mat to save the outputs
    cv::Mat outImage = cv::Mat::zeros(round(height*k1), round(width*k2), CV_64FC1);

    for (int row = 0; row < outImage.rows; row++)
    {
        for (int col = 0; col < outImage.cols; col++)
        {
        	//得到放大图坐标在原图中对应的坐标
            double srcX = (1 / 1.4)*row;
            double srcY = (1 / 1.7)*col;

            if (srcX > (grayImage.rows - 1))
            {
                srcX = grayImage.rows - 1;
            }
            if (srcY > (grayImage.cols - 1))
            {
                srcY = grayImage.cols - 1;
            }

            // Get x0,x1,y0,y1
            int x0 = floor(srcX);
            int x1 = ceil(srcX);
            int y0 = floor(srcY);
            int y1 = ceil(srcY);

            if ((x0 == x1) && (y0 == y1))
            {
                outImage.at<double>(row, col) = (double)grayImage.at<uchar>(x0, y0);
                continue;
            }
            // 如果是边缘点,则使用单线性插值
            if (x0 == x1)
            {
                double temp = (y1 - srcY)*grayImage.at<uchar>(x0, y0)+
                               (srcY-y0)*grayImage.at<uchar>(x0,y1);
                outImage.at<double>(row, col) = temp;
                continue;
            }
            if (y0 == y1)
            {
                double temp = (x1 - srcX)*grayImage.at<uchar>(x0, y0) +
                    (srcX - x0)*grayImage.at<uchar>(x1, y1);
                outImage.at<double>(row, col) = temp;
                continue;
            }
            // 不是边缘点则使用双线性插值
            double temp1 = (y1 - srcY)*grayImage.at<uchar>(x0, y0) +
                (srcY - y0)*grayImage.at<uchar>(x0, y1);
            double temp2 = (y1 - srcY)*grayImage.at<uchar>(x1, y0) +
                (srcY - y0)*grayImage.at<uchar>(x1, y1);
            double temp = (x1 - srcX)*temp1 + (srcX - x0)*temp2;
            outImage.at<double>(row, col) = temp;
        }
    }
    // Convert CV_64FC1 to CV_8UC1 
    outImage.convertTo(outImage, CV_8UC1);
    return 0;
}

到了这里,关于数字图像处理(十三)图像放大及双线性插值算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Matlab图像处理-灰度插值法

    最近邻法 最近邻法是一种最简单的插值算法,输出像素的值为输入图像中与其最邻近的采样点的像素值。是将 ( u 0 , v 0 ) (u_0,v_0) 点最近的整数坐标 u , v (u,v) 点的灰度值取为 ( u 0 , v 0 ) (u_0,v_0) 点的灰度值。 在 ( u 0 , v 0 ) (u_0,v_0) 点各相邻像素间灰度变化较小时,这种方法是一

    2024年02月10日
    浏览(37)
  • Python图像处理:1.插值、频域变换与对比度增强

    7.图像的插值 (1)原理介绍 下面对比三种插值方法,分别是最近邻插值法、双线性插值法、卷积插值法,三种方法的前提和特点、优缺点、适用场景如下: 最近邻插值(Nearest Neighbor Interpolation) : 前提与特点 :这是最简单的插值方法,不考虑相邻像素的影响,只取最近的像

    2024年03月13日
    浏览(37)
  • OpenCV单通道图像按像素成倍比例放大(无高斯平滑处理)

    OpenCV中的resize函数可以对图像做任意比例的放大(/缩小)处理,该处理过程会对图像做高斯模糊化以保证图像在进行放大(/缩小)后尽可能保留源图像所展现的具体内容(消除固定频率插值/采样带来的香农采样信息损失),但在有些场景中该方法不适用,如:部分应用场景只

    2024年04月11日
    浏览(35)
  • 数字图像处理实验——数字图像处理初步

    一、实验目的与要求 1.熟悉及掌握在MATLAB中能够处理哪些格式的图像; 2.熟练掌握在MATLAB中如何读取图像及图像的属性信息(大小、颜色、亮度(灰度)、宽度、高度等); 3.掌握如何在MATLAB中按照指定要求存储一副图像的方法; 4.了解图像的算术运算在数字图像中的初步应

    2024年02月04日
    浏览(35)
  • 数字图像处理第六章——彩色图像处理

    目录 引言 一、彩色基础 二、彩色模型 2.1 RGB彩色模型 2.2 CMY和CMYK彩色模型  2.3 HSI彩色模型 三、伪彩色图像处理 3.1 灰度分层 3.2 灰度到彩色的变换 四、彩色变换 ​编辑色调与色彩校正 五、平滑与锐化 5.1 平滑 5.2 锐化         在图像处理中,彩色的运用受两个主要因素

    2024年02月09日
    浏览(36)
  • 数字图像处理--六、图像压缩

    目录 1.基本概念 1.1 图像压缩概念及其分类 1.2 数据冗余 1.3 图像信息的度量 1.4 图像保真度准则 (Fidelity Criteria) 1.5 图像压缩模型 2.图像压缩方法 2.1Huffman编码 消除编码冗余 2.2算术编码 (Arithmetic Coding) 消除编码冗余 2.3LZW编码 (Lempel-Ziv-Welch coding) 2.4位平面编码 2.5预测编码 预测

    2024年02月12日
    浏览(24)
  • 数字图像处理(番外)图像增强

    图像增强的方法是通过一定手段对原图像附加一些信息或变换数据,有选择地突出图像中感兴趣的特征或者抑制(掩盖)图像中某些不需要的特征,使图像与视觉响应特性相匹配。 图像对比度计算方式如下: C = ∑ δ δ ( i , j ) P δ ( i , j ) C=displaystylesum_{{delta}}delta(i,j)P_delta(

    2024年02月14日
    浏览(35)
  • 数字信号与图像处理实验三:图像处理基础与图像变换

    ​ 通过本实验加深对数字图像的理解,熟悉MATLAB中的有关函数;应用DCT对图像进行变换;熟悉图像常见的统计指标,实现图像几何变换的基本方法。 ​ 选择两幅图像,读入图像并显示,同时使用Matlab计算图像的大小,灰度平均值、协方差矩阵、灰度标准差和相关系数。 DC

    2024年02月04日
    浏览(46)
  • 基于matlab的数字图像处理之彩色图像处理

    一、实验目的 (1)了解如何利用RGB分量生成简单的图像。 (2)熟练掌握RGB彩色模型转换到HIS彩色模型的过程。 (3)熟练掌握RGB图像的彩色分割。 (4)熟练掌握彩色图像如何在向量空间中进行边缘检测。 二、实验仪器(软件平台)     计算机、MATLAB软件 三、实验原理

    2024年02月06日
    浏览(35)
  • 数字图像处理 - 图像处理结合机器学习的应用示例

            在本文中,特别关注树叶分类机器学习技术的实现。我们的目标是演示如何利用机器学习算法来分析一系列叶子照片,从而实现准确分类并提供对植物领域有价值的算法。         图像处理中机器学习的本质         机器学习使计算机能够学习模式并根据

    2024年02月13日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包