C++图像处理简单版
文章目录
- 编程水平测试
- 读取
- 合成
- 拆解
- 作业中的调色
- 加边框
- 反转
- 旋转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++图像处理简单版相关推荐
- LeetCode 11. Container With Most Water--Java 解法--困雨水简单版
LeetCode 11. Container With Most Water–Java 解法 此文首发于我的个人博客:LeetCode 11. Container With Most Water–Ja ...
- 【资源分享】数字图像处理MATLAB版冈萨雷斯+中文高清版+随书源码链接
写在这里的初衷,一是备忘,二是希望得到高人指点,三是希望能遇到志同道合的朋友. 目录 1.数字图像处理MATLAB版冈萨雷斯+中文高清版 2.数字图像处理MATLAB版冈萨雷斯随书源码 1.数字图像处 ...
- luogu P3808 【模板】AC自动机(简单版)
二次联通门 : luogu P3808 [模板]AC自动机(简单版) /*luogu P3808 [模板]AC自动机(简单版)手速越来越快了10分钟一个AC自动机一遍过编译 + 一边AC感觉不错我也就 ...
- 008 数据结构逆向—数组(简单版)
文章目录 前言 逆向背包数组 一维背包数组 二维背包数组 数组结构分析 总结 前言 对于游戏逆向来说,核心需求其实就只有两个 追踪游戏数据 定位游戏功能call 对于追踪游戏数据来说,单纯从一个寄存器 ...
- 【模板】AC自动机(简单版)
题目背景 通过套取数据而直接"打表"过题者,是作弊行为,发现即棕名. 这是一道简单的AC自动机模板题. 用于检测正确性以及算法常数. 为了防止卡OJ,在保证正确的基础上只有两组数据 ...
- P3808,P3796-[模板]AC自动机(简单版/加强版)
简单版 题目链接: https://www.luogu.org/problem/P3808 题目大意 nnn个模式串,一个文本串,求有多少个模式串出现在文本串里. 解题思路 普通ACACAC自动机不解 ...
- C++学习之路 | PTA乙级—— 1089 狼人杀-简单版(精简)
1089 狼人杀-简单版 (20 分)以下文字摘自<灵机一动·好玩的数学>:"狼人杀"游戏分为狼人.好人两大阵营.在一局"狼人杀"游戏中,1 号玩家 ...
- node+express项目链接MySQL数据库(最简单版)
node+express项目链接MySQL数据库(最简单版) (假定你node+express项目已创建完成,可参照这里) 第一步.安装mysql驱动 npm install mysql --save ...
- 简单版---JS获得某天是一年当中的第几天
简单版的就是不用那么繁琐的去用switch一个月一个月的把天数相加,这里运用的是JS对象的日期对象的方法. 大致的实现原理,就是用需要计算的那天减去当年的第一天,得出差值,进行相关的计算得到答案. & ...
最新文章
- k8s-harbor安装
- SQLiteOpenHelper类
- swift_016(Swift 的闭包)
- Oracle database datafile header中记录的datafile的大小
- mooc北京大学python_实用Python程序设计
- STM32之通用定时器输出比较模式
- tensorflow--filter、strides
- 一线城市BAT名企软件测试职位解析,有什么样的技术要求?
- 软件工程-团队作业3
- Softmax Function
- Javascript单例模式概念与实例
- singleTask和startActivityResult
- Word文档的规范格式
- 区块链赋能数字交通建设 PPT
- thinkpadX1C2021充不进去电(去除静电后依旧无效的来看看)
- Extended Kalman Filter vs. Error State Kalman Filter for Aircraft Attitude Estimation 翻译
- Android 6.0系统读写文件问题( Permission denied)
- 白盒测试简介与逻辑覆盖
- 有关clipToPadding、 clipChildren的那些事
- java 圆角窗口_JAVA实现圆角窗体 .