C++图像处理简单版
2022/1/15 20:05:31
本文主要是介绍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; // Robust if (!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; //加载源图像src src = 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_REPLICATE for(;;) { 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++图像处理简单版的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2025-01-12深入理解 ECMAScript 2024 新特性:Map.groupBy() 分组操作
- 2025-01-11国产医疗级心电ECG采集处理模块
- 2025-01-10Rakuten 乐天积分系统从 Cassandra 到 TiDB 的选型与实战
- 2025-01-09CMS内容管理系统是什么?如何选择适合你的平台?
- 2025-01-08CCPM如何缩短项目周期并降低风险?
- 2025-01-08Omnivore 替代品 Readeck 安装与使用教程
- 2025-01-07Cursor 收费太贵?3分钟教你接入超低价 DeepSeek-V3,代码质量逼近 Claude 3.5
- 2025-01-06PingCAP 连续两年入选 Gartner 云数据库管理系统魔力象限“荣誉提及”
- 2025-01-05Easysearch 可搜索快照功能,看这篇就够了
- 2025-01-04BOT+EPC模式在基础设施项目中的应用与优势