OpenCV像素操作---将图片缩小后融入另一个图像

学更好的别人,

做更好的自己。

——《微卡智享》

本文长度为1671,预计阅读5分钟

前言

前两天刷B站时无意间刷到一个图片缩小后内容变的完全不同,蛮有趣的,视频下面也有源码地址,是用Python实现的,所以决定用C++ OpenCV也来玩玩这个。

1

思路来源

视频地址:https://www.bilibili.com/video/BV1Lf4y1r7dZ


源码地址:https://github.com/3150601355/SimpleScaleDown

实现效果

实现思路

#实现思路
1缩小后看到的图调整到正常图像缩小10倍后的大小
2使用最邻近像素的原理将缩小后的图像像素点在正常图像上替换
3替换完成的图像保存为新的文件

最近邻实现原理

01

放大效果

02

缩小效果

按照上面的原理,我们将隐藏的图缩小到原来图像十分之一后,针对关键的像素点替换掉我们缩小后的图像的像素点即可。

可以看到上图中我们把图像放大后,会有马赛克的小点,其实就是把我们缩小的图像像素点已经替换完成了。

代码实现

微卡智享

#include <iostream>
#include <opencv2/opencv.hpp>


using namespace cv;
using namespace std;


Mat matresize(Mat& bigsrc, Mat& smallsrc, int step=10);


int main(int argc, char** argv) {
  //读取图像一
  Mat src1 = imread("E:/DCIM/Resize/src1.png");
  imshow("src1", src1);
  //读取图像二
  Mat src2 = imread("E:/DCIM/Resize/src2.png");
  imshow("src2", src2);


  //根据两个图像生成新的Mat
  Mat dst = matresize(src1, src2);
  //将图像保存到本地
  imwrite("E:/DCIM/Resize/resize.png", dst);


  imshow("resize", dst);
  waitKey(0);
  return 0;
}


//第二张图为第一张图的10倍缩小
Mat matresize(Mat& bigsrc, Mat& smallsrc, int step)
{
  //如果倍数小于等于0直接退出
  if (step <= 0) return Mat();


  Mat dst, tmpsrc;
  //复制输出图像
  bigsrc.copyTo(dst);


  //计算第二张图要缩放的大小
  int calccol = bigsrc.cols / step;
  int calcrow = bigsrc.rows / step;
  resize(smallsrc, tmpsrc, Size(calccol, calcrow));


  for (int col = 0; col < calccol; ++col) {
    for (int row = 0; row < calcrow; ++row) {
      int mapcol = col * step + step * 0.5;
      int maprow = row * step + step * 0.5;


      //改变输出图的值
      if (mapcol < dst.cols && maprow < dst.rows) {
        dst.at<Vec3b>(maprow, mapcol) = tmpsrc.at<Vec3b>(row, col);
      }
    }
  }


  return dst;
}


运行效果

源码地址

https://github.com/Vaccae/OpenCVDemoCpp.git

点击下方的原文链接可以跳转到码云的源码地址。

扫描二维码

获取更多精彩

微卡智享

「 往期文章 」

C++ OpenCV三种图像卡通化方法对比

.NET5 Blazor初探

实战笔记--SQL Server临时表、With As、Row_Number和游标的综合使用

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Vaccae

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值