opencv C++ 实现图像缩放(双线性差值)

https://blog.csdn.net/qq_37344125/article/details/109244692

 这篇文章是用pyhon实现的,嵌入式中一般不支持python,甚至不支持opencv接口,但是只要拿到图像数据的指针,代码基本一致。

 实现图像放大缩小

    int dst_h = 20;
    int dst_w = 224;

这是缩放后的大小

#include <iostream>
#include "opencv.hpp"
#include<vector>
using namespace cv;
int main()
{
    Mat src = imread("C:/Users/xxx/Desktop/1123.png");
    imshow("src", src);
    Mat channels[3];
    split(src, channels);
//原图指针
    Mat B = channels[0];
    Mat G = channels[1];
    Mat R = channels[2];
//原图大小
    int rows = B.rows;
    int cols = B.cols;
//目的图像大小
    int dst_h = 20;
    int dst_w = 224;
//目的图像指针
    Mat B2  = Mat::zeros(Size(dst_w, dst_h),CV_8UC1);
    Mat G2 = Mat::zeros(Size(dst_w, dst_h), CV_8UC1);
    Mat R2 = Mat::zeros(Size(dst_w, dst_h), CV_8UC1);
    std::vector<Mat> dst_channels;
    dst_channels.push_back(B2);
    dst_channels.push_back(G2);
    dst_channels.push_back(R2);


    
  //缩放倍数
    float scale_x = float(cols)/dst_w;
    float scale_y = float(rows)/dst_h;

    for (int des_y = 0; des_y < dst_h; des_y++) {
        for (int des_x = 0; des_x < dst_w; des_x++) {

            float src_x = (des_x + 0.5) * scale_x - 0.5;
            float src_y = (des_y + 0.5) * scale_y - 0.5;
            //左侧的 点的位置
            int src_x_1 = int(floor(src_x));
            int src_y_1 = int(floor(src_y));
            //右侧点的位置
            int src_x_2 = std::min(src_x_1 + 1, cols - 1);
            int src_y_2 = std::min(src_y_1 + 1, rows - 1);

            uchar* v1 = B.data + src_y_1 * cols + src_x_1;
            uchar* v2 = B.data + src_y_1 * cols + src_x_2;
            uchar* v3 = B.data + src_y_2 * cols + src_x_1;
            uchar* v4 = B.data + src_y_2 * cols + src_x_2;
            uchar value_1 = (src_x_2 - src_x) * *v1 + (src_x - src_x_1) * *v2;
            uchar value_2 = (src_x_2 - src_x) * *v3 + (src_x - src_x_1) * *v4;
            
            *(B2.data + des_y * dst_w + des_x) = (src_y_2 - src_y) * value_1 + (src_y - src_y_1) * value_2;
        }
    }
    for (int des_y = 0; des_y < dst_h; des_y++) {
        for (int des_x = 0; des_x < dst_w; des_x++) {

            float src_x = (des_x + 0.5) * scale_x - 0.5;
            float src_y = (des_y + 0.5) * scale_y - 0.5;
            //左侧的 点的位置
            int src_x_1 = int(floor(src_x));
            int src_y_1 = int(floor(src_y));
            //右侧点的位置
            int src_x_2 = std::min(src_x_1 + 1, cols - 1);
            int src_y_2 = std::min(src_y_1 + 1, rows - 1);

            uchar* v1 = G.data + src_y_1 * cols + src_x_1;
            uchar* v2 = G.data + src_y_1 * cols + src_x_2;
            uchar* v3 = G.data + src_y_2 * cols + src_x_1;
            uchar* v4 = G.data + src_y_2 * cols + src_x_2;
            uchar value_1 = (src_x_2 - src_x) * *v1 + (src_x - src_x_1) * *v2;
            uchar value_2 = (src_x_2 - src_x) * *v3 + (src_x - src_x_1) * *v4;

            *(G2.data + des_y * dst_w + des_x) = (src_y_2 - src_y) * value_1 + (src_y - src_y_1) * value_2;
        }
    }

    for (int des_y = 0; des_y < dst_h; des_y++) {
        for (int des_x = 0; des_x < dst_w; des_x++) {

            float src_x = (des_x + 0.5) * scale_x - 0.5;
            float src_y = (des_y + 0.5) * scale_y - 0.5;
            //左侧的 点的位置
            int src_x_1 = int(floor(src_x));
            int src_y_1 = int(floor(src_y));
            //右侧点的位置
            int src_x_2 = std::min(src_x_1 + 1, cols - 1);
            int src_y_2 = std::min(src_y_1 + 1, rows - 1);

            uchar* v1 = R.data + src_y_1 * cols + src_x_1;
            uchar* v2 = R.data + src_y_1 * cols + src_x_2;
            uchar* v3 = R.data + src_y_2 * cols + src_x_1;
            uchar* v4 = R.data + src_y_2 * cols + src_x_2;
            uchar value_1 = (src_x_2 - src_x) * *v1 + (src_x - src_x_1) * *v2;
            uchar value_2 = (src_x_2 - src_x) * *v3 + (src_x - src_x_1) * *v4;

            *(R2.data + des_y * dst_w + des_x) = (src_y_2 - src_y) * value_1 + (src_y - src_y_1) * value_2;
        }
    }

    Mat dst;
    merge(dst_channels, dst);
    imshow("dst", dst);
    waitKey(0);

}

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值