文章目录

  • 编程水平测试
    • 读取
    • 合成
    • 拆解
      • 作业中的调色
    • 加边框
    • 反转
    • 旋转180度
  • 考完总结

编程水平测试

在已有代码的基础上实现图片的各种效果,我就写个思路

读取

老师写了,不用管

合成

参考合成

拆解

可能就是控制rgb三色单通道的关闭

作业中的调色

在ImageMain.cpp的基础上完成下列任务:
(1)将buf中的图像数据按通道存入三个二维数组,分别为b、g、r(蓝绿红)。
(2)调色:按比例调整bgr的值,以产生不同的颜色效果。
bmp图片的宽度(w)应该为4的倍数,才可以正常处理

头文件

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
#include<Windows.h>
#include<malloc.h>
#include<stdlib.h>
#include<stdio.h>
#include<string.h>
#include<math.h>
using namespace std;

定义数组

// 存储图片的二维数组
#define MAX_H 3000
#define MAX_W 3000
char r[MAX_H][MAX_W];
char g[MAX_H][MAX_W];
char b[MAX_H][MAX_W];

然后调色,按比例调整rgb的值,以产生不同的颜色效果。

void Process(char* buf, DWORD& w, DWORD& h, const int b_weight, const int g_weight, const int r_weight)
{char* p;double b_w, g_w, r_w;// Robustif (!b_weight || !g_weight || !r_weight) {cout << "error\n";return;}// 计算比例:b_w = (double)b_weight / (b_weight + g_weight + r_weight);g_w = (double)g_weight / (b_weight + g_weight + r_weight);r_w = (double)r_weight / (b_weight + g_weight + r_weight);p = buf;//int r, g, b;for (int j = 0; j < h; j++){for (int i = 0; i < w; i++){if ((int)*p * b_w > 255)*p = 255;   //越界问题,下面两个同理,就不写了else*p = *p * b_w;p++;b[j][i] = *p;*p = *p * g_w; p++;g[j][i] = *p;*p = *p * r_w; p++;r[j][i] = *p;}}
}

然后在main文件里加

int b_weight = 1, g_weight = 2, r_weight = 3;

加边框

有两种方法:

  • BORDER_CONSTANT:用恒定值(即255或0)填充图像
  • BORDER_REPLICATE:原始边缘的行或列复制到额外边框

或者更简单一点:将图像最外面一层改掉

void process1(int w,int h){for(i=0;i<w;++i){r[i][0]=0;//下面gb通道同理r[i][h]=0;}for(j=0;j<h;++j){r[0][j]=0;r[w][j]=0;}
}
#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/imgcodecs.hpp"
#include "opencv2/highgui/highgui.hpp"
#include <stdlib.h>
#include <stdio.h>
using namespace cv;
//声明变量
Mat src, dst;
int top, bottom, left, right;
int borderType;
const char* window_name = "copyMakeBorder Demo";
RNG rng(12345);int main( int, char** argv )
{int c;//加载源图像srcsrc = imread( argv[1] );if( src.empty() ){printf(" No data entered, please enter the path to an image file \n");return -1;}printf( "\n \t copyMakeBorder Demo: \n" );printf( "\t -------------------- \n" );printf( " ** Press 'c' to set the border to a random constant value \n");printf( " ** Press 'r' to set the border to be replicated \n");printf( " ** Press 'ESC' to exit the program \n");namedWindow( window_name, WINDOW_AUTOSIZE );//创建一个窗口//初始化定义边框大小(顶部,底部,左侧和右侧)的参数。值是src大小的5%top = (int) (0.05*src.rows); bottom = (int) (0.05*src.rows);left = (int) (0.05*src.cols); right = (int) (0.05*src.cols);dst = src;imshow( window_name, dst );//开始循环,如果按下'c'或'r',则borderType变量分别取值BORDER_CONSTANT或BORDER_REPLICATEfor(;;){c = waitKey(500);if( (char)c == 27 ){ break; }else if( (char)c == 'c' ){ borderType = BORDER_CONSTANT; }else if( (char)c == 'r' ){ borderType = BORDER_REPLICATE; }//在每次迭代中(0.5秒后),更新变量值Scalar value( rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255) );//调用函数cv :: copyMakeBorder来应用相应的填充copyMakeBorder( src, dst, top, bottom, left, right, borderType, value );imshow( window_name, dst );}return 0;
}

src:源图像

dst:目标图像

top,bottom,left,right:图像两侧边框的长度(以像素为单位)。 将它们定义为图像原始大小的5%。

borderType:定义应用的边框类型。 对于此示例,它可以是常量或复制。

value:如果borderType为BORDER_CONSTANT,则这是用于填充边框像素的值。

反转

void process2(int h,int w) {for(int i =0;i<h;++i)for (int j =0 ; j < w; ++j) {swap(b[i][j], b[i][w - j]);swap(g[i][j], g[i][w - j]);swap(r[i][j], r[i][w - j]);}
}

应该是左右交换

旋转180度

void process3(int h,int w){for (int i=0;i<w;++i){for(int j=0;j<h-h/w*i;++j){swap(b[i][j],b[w-i][h-j]);swap(g[i][j],b[w-i][h-j]);swap(r[i][j],b[w-i][h-j]);}}
}

考完总结

合成就是简单的一张小图覆盖掉大图中的一部分,拆解就是从大图中拿出一部分图,都挺简单,完整程序就不放了

C++图像处理简单版相关推荐

  1. LeetCode 11. Container With Most Water--Java 解法--困雨水简单版

    LeetCode 11. Container With Most Water–Java 解法 此文首发于我的个人博客:LeetCode 11. Container With Most Water–Ja ...

  2. 【资源分享】数字图像处理MATLAB版冈萨雷斯+中文高清版+随书源码链接

    写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 1.数字图像处理MATLAB版冈萨雷斯+中文高清版 2.数字图像处理MATLAB版冈萨雷斯随书源码 1.数字图像处 ...

  3. luogu P3808 【模板】AC自动机(简单版)

    二次联通门 : luogu P3808 [模板]AC自动机(简单版) /*luogu P3808 [模板]AC自动机(简单版)手速越来越快了10分钟一个AC自动机一遍过编译 + 一边AC感觉不错我也就 ...

  4. 008 数据结构逆向—数组(简单版)

    文章目录 前言 逆向背包数组 一维背包数组 二维背包数组 数组结构分析 总结 前言 对于游戏逆向来说,核心需求其实就只有两个 追踪游戏数据 定位游戏功能call 对于追踪游戏数据来说,单纯从一个寄存器 ...

  5. 【模板】AC自动机(简单版)

    题目背景 通过套取数据而直接"打表"过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据 ...

  6. P3808,P3796-[模板]AC自动机(简单版/加强版)

    简单版 题目链接: https://www.luogu.org/problem/P3808 题目大意 nnn个模式串,一个文本串,求有多少个模式串出现在文本串里. 解题思路 普通ACACAC自动机不解 ...

  7. C++学习之路 | PTA乙级—— 1089 狼人杀-简单版(精简)

    1089 狼人杀-简单版 (20 分)以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀"游戏中,1 号玩家 ...

  8. node+express项目链接MySQL数据库(最简单版)

    node+express项目链接MySQL数据库(最简单版) (假定你node+express项目已创建完成,可参照这里) 第一步.安装mysql驱动 npm install mysql --save ...

  9. 简单版---JS获得某天是一年当中的第几天

    简单版的就是不用那么繁琐的去用switch一个月一个月的把天数相加,这里运用的是JS对象的日期对象的方法. 大致的实现原理,就是用需要计算的那天减去当年的第一天,得出差值,进行相关的计算得到答案. & ...

最新文章

  1. k8s-harbor安装
  2. SQLiteOpenHelper类
  3. swift_016(Swift 的闭包)
  4. Oracle database datafile header中记录的datafile的大小
  5. mooc北京大学python_实用Python程序设计
  6. STM32之通用定时器输出比较模式
  7. tensorflow--filter、strides
  8. 一线城市BAT名企软件测试职位解析,有什么样的技术要求?
  9. 软件工程-团队作业3
  10. Softmax Function
  11. Javascript单例模式概念与实例
  12. singleTask和startActivityResult
  13. Word文档的规范格式
  14. 区块链赋能数字交通建设 PPT
  15. thinkpadX1C2021充不进去电(去除静电后依旧无效的来看看)
  16. Extended Kalman Filter vs. Error State Kalman Filter for Aircraft Attitude Estimation 翻译
  17. Android 6.0系统读写文件问题( Permission denied)
  18. 白盒测试简介与逻辑覆盖
  19. 有关clipToPadding、 clipChildren的那些事
  20. java 圆角窗口_JAVA实现圆角窗体 .

热门文章

  1. 如何自学UI设计?如何成为UI设计师?
  2. 如何将Word转化为Markdown文本
  3. R: RStudio的中文读取、保存与显示
  4. wps excel 链接url转图片工具
  5. audio muted属性绑定无效 vue
  6. 网络编程代码实例:多进程版
  7. 获得商品详情API接口
  8. springBoot 项目自定义命名application.properties配置文件名称
  9. Iptables DNAT实现broadcast与unicast之间相互映射
  10. python实现随机验证码图片生成