C++opencv进行图像处理(三)图像的基本操作

2023-11-10

1.图像像素的加法

         主要包含了图像的像素加法,当像素增加,会使得图像变亮,当像素减少会使得图像变暗。除法操作会变暗,结果如下所示:

左边是原图,右边是像素相加后的。

在前面的代码模块中增加的代码为:


void QuickDemo::pixel_operators_demo(Mat &image){
	Mat dst;
	dst = image + Scalar(50, 50, 50);
	imshow("像素加法操作", dst);
}

2.滚动条操作调整图像的亮度

通过滚动进度条调节图像的亮度,代码如下所示:

Mat src,dst, m;
int lightness = 50;
static void on_track(int, void*) {
	m = Scalar(lightness, lightness, lightness);
	add(src, m, dst);
	imshow("亮度调整",dst);
}
void QuickDemo::tracking_bar_demo(Mat &image) {
	//创建一个窗口进行亮度调节
	namedWindow("亮度调节", WINDOW_AUTOSIZE);
	dst = Mat::zeros(image.size(), image.type());
	m = Mat::zeros(image.size(), image.type());
	int max_value = 100;

	//在窗口上创建createTrackbar函数
	createTrackbar("Value Bar:", "亮度调节", &lightness, max_value, on_track);
	on_track(50, 0);
}

3.生成矩形

void QuickDemo::bitwise_demo(Mat& image) {
	Mat m1 = Mat::zeros(Size(256, 256), CV_8UC3);
	Mat m2 = Mat::zeros(Size(256, 256), CV_8UC3);
	//对于m1图像画矩形,左上角的坐标是(100,100),矩形的大小是(80*80),矩形的颜色scalar是(255,255,0)
	//thickness参数大于0表示绘制矩形,小于0表示填充矩形
	rectangle(m1, Rect(100, 100, 80, 80), Scalar(255,255,0),-1, LINE_8, 0);
	rectangle(m2, Rect(150, 150, 80, 80), Scalar(0, 255, 255), -1, LINE_8, 0);
	imshow("m1", m1);
	imshow("m2", m2);
}

结果如下所示:

4.通道分离

//主要完成通道分离与通道合并
void QuickDemo::channels_demo(Mat &image) {
	//由于有多个通道,所以用集合容器,把多个通道放进容器
	std::vector<Mat> mv;
	split(image, mv);
	imshow("蓝色", mv[0]);
	imshow("绿色", mv[1]);
	imshow("红色", mv[2]);

}

上图分别是原图,蓝绿红。有的人说这不都是灰色图吗?其实不然。如果我们要是想彰显每个通道的颜色,只需要把其他通道设置为0,那么只剩下你想要彰显的通道颜色,如下所示,可以把函数增加如下几行代码:

void QuickDemo::channels_demo(Mat &image) {
	//由于有多个通道,所以用集合容器,把多个通道放进容器
	std::vector<Mat> mv;
	split(image, mv);
	imshow("蓝色", mv[0]);
	imshow("绿色", mv[1]);
	imshow("红色", mv[2]);

	Mat dst;
	mv[1] = 0;
	mv[2] = 0;
	merge(mv, dst);
	imshow("蓝色", dst);
}

其他通道的就不再赘述。

5.颜色空间转换

void QuickDemo::inrange_demo(Mat& image) {
	Mat hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);
	Mat mask;
	//inRange()函数OpenCV中的inRange()函数可实现二值化功能,更关键的是可以同时针对多通道进行操作,使用起来非常方便!
	//主要是将在两个阈值内的像素值设置为白色(255),而不在阈值区间内的像素值设置为黑色(0),该功能类似于之间所讲的双阈值化操作。
	//第一个Scalar是绿色hsv三个参数的最小值,第二个是最大值,可以把背景为绿色的去掉,转化为二值化图像
	inRange(hsv, Scalar(35,43,46), Scalar(77,255,255), mask);
	imshow("mask", mask);
}

           

6.图像像素值的统计计算均值和方差

          (1) 对于灰度图单通道的图像可以如下这么做进行统计,但是对于彩色图不行。

void QuickDemo::pixel_statistic_demo(Mat& image) {
	double minv, maxv;
	Point minLoc, maxLoc;
	minMaxLoc(image, &minv, &maxv, &minLoc, &maxLoc, Mat());
	std::cout << "min value:" << minv << "max value:" << maxv << std::endl;
	//求取均值和方差
	Mat mean, stddev;
	meanStdDev(image, mean, stddev);
	std::cout << "means:" << mean << "stddev:" << stddev << std::endl;
}

        (2)对于彩色图三通道做法如下:需要分别统计每一个通道的像素均值和方差,代码如下:

void QuickDemo::pixel_statistic_demo(Mat& image) {
	double minv, maxv;
	Point minLoc, maxLoc;
	std::vector<Mat> mv;
	split(image, mv);
	for (int i = 0; i < mv.size(); i++) {
		minMaxLoc(mv[i], &minv, &maxv, &minLoc, &maxLoc, Mat());
		std::cout << "min value:" << minv << "max value:" << maxv << std::endl;
	}
	//求取均值和方差
	Mat mean, stddev;
	meanStdDev(image, mean, stddev);
	std::cout << "means:" << mean << "stddev:" << stddev << std::endl;
}

结果如下所示:

7.在图像上画矩形框

void QuickDemo::drawing_demo(Mat& image) {
	Rect rect;
	rect.x = 200;
	rect.y = 200;
	rect.width = 100;
	rect.height = 100;
	rectangle(image, rect, Scalar(0, 0, 255),2, 8, 0);
	imshow("绘制演示", image);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++opencv进行图像处理(三)图像的基本操作 的相关文章

  • 部署 MVC4 项目时出错:找不到文件或程序集

    过去 我只需使用 Visual Studio 2012 发布到 AWS 菜单项即可部署我的 MVC4 网站 到 AWS Elastic Beanstalk 现在 程序可以在本地编译并运行 但无法部署 从消息来看 它似乎正在寻找不在当前部署的
  • Signalr 在生产服务器中总是陷入长轮询

    当我在服务器中托管应用程序时 它会检查服务器端事件并始终回退到长轮询 服务器托管环境为Windows Server 2012 R1和IIS 7 5 无论如何 我们是否可以解决这个问题 https cloud githubuserconten
  • 模板类的不明确多重继承

    我有一个真实的情况 可以总结为以下示例 template lt typename ListenerType gt struct Notifier void add listener ListenerType struct TimeListe
  • 在 Xamarin Android 中将图像从 URL 异步加载到 ImageView 中

    我有一个包含多个项目的 ListView 列表中的每个项目都应该有一个与之关联的图像 我创建了一个数组适配器来保存每个列表项并具有我希望加载的图像的 url 我正在尝试使用 Web 请求异步加载图像 并设置图像并在加载后在视图中更新它 但视
  • 如何在C++中实现模板类协变?

    是否可以以这样一种方式实现类模板 如果模板参数相关 一个对象可以转换为另一个对象 这是一个展示这个想法的例子 当然它不会编译 struct Base struct Derived Base template
  • 嵌入式系统中的malloc [重复]

    这个问题在这里已经有答案了 我正在使用嵌入式系统 该应用程序在 AT91SAMxxxx 和 cortex m3 lpc17xxx 上运行 我正在研究动态内存分配 因为它会极大地改变应用程序的外观 并给我更多的力量 我认为我唯一真正的路线是为
  • FFMPEG Seeking 带来音频伪影

    我正在使用 ffmpeg 实现音频解码器 在读取音频甚至搜索已经可以工作时 我无法找到一种在搜索后清除缓冲区的方法 因此当应用程序在搜索后立即开始读取音频时 我没有任何工件 avcodec flush buffers似乎对内部缓冲区没有任何
  • SSH 主机密钥指纹与模式 C# WinSCP 不匹配

    我尝试通过 WinSCP 使用 C 连接到 FTPS 服务器 但收到此错误 SSH 主机密钥指纹 与模式不匹配 经过大量研究 我相信这与密钥的长度有关 当使用 服务器和协议信息 下的界面进行连接时 我从 WinSCP 获得的密钥是xx xx
  • Cygwin 下使用 CMake 编译库

    我一直在尝试使用 CMake 来编译 TinyXML 作为一种迷你项目 尝试学习 CMake 作为补充 我试图将其编译成动态库并自行安装 以便它可以工作 到目前为止 我已经设法编译和安装它 但它编译成 dll 和 dll a 让它工作的唯一
  • 为什么 POSIX 允许在只读模式下超出现有文件结尾 (fseek) 进行搜索

    为什么寻找文件结尾很有用 为什么 POSIX 让我们像示例中那样在以只读方式打开的文件中进行查找 c http en cppreference com w c io fseek http en cppreference com w c io
  • 当 Cortex-M3 出现硬故障时如何保留堆栈跟踪?

    使用以下设置 基于 Cortex M3 的 C gcc arm 交叉工具链 https launchpad net gcc arm embedded 使用 C 和 C FreeRtos 7 5 3 日食月神 Segger Jlink 与 J
  • 使用向量的 merge_sort 在少于 9 个输入的情况下效果很好

    不知何故 我使用向量实现了合并排序 问题是 它可以在少于 9 个输入的情况下正常工作 但在有 9 个或更多输入的情况下 它会执行一些我不明白的操作 如下所示 Input 5 4 3 2 1 6 5 4 3 2 1 9 8 7 6 5 4 3
  • 作为字符串的动态属性名称

    使用 DocumentDB 创建新文档时 我想设置属性名称动态地 目前我设置SomeProperty 像这样 await client CreateDocumentAsync dbs db colls x new SomeProperty
  • 如何构建印度尼西亚电话号码正则表达式

    这些是一些印度尼西亚的电话号码 08xxxxxxxxx 至少包含 11 个字符长度 08xxxxxxxxxxx 始终以 08 开头 我发现这个很有用 Regex regex new Regex 08 0 9 0 9 0 9 0 9 0 9
  • 如何在内存中存储分子?

    我想将分子存储在内存中 这些可以是简单的分子 Methane CH4 C H bond length 108 7 pm H H angle 109 degrees But also more complex molecules like p
  • ListDictionary 类是否有通用替代方案?

    我正在查看一些示例代码 其中他们使用了ListDictionary对象来存储少量数据 大约 5 10 个对象左右 但这个数字可能会随着时间的推移而改变 我使用此类的唯一问题是 与我所做的其他所有事情不同 它不是通用的 这意味着 如果我在这里
  • 在Linux中使用C/C++获取机器序列号和CPU ID

    在Linux系统中如何获取机器序列号和CPU ID 示例代码受到高度赞赏 Here http lxr linux no linux v2 6 39 arch x86 include asm processor h L173Linux 内核似
  • 在 ASP.NET 中将事件冒泡为父级

    我已经说过 ASP NET 中的层次结构 page user control 1 user control 2 control 3 我想要做的是 当控件 3 它可以是任何类型的控件 我一般都想这样做 让用户用它做一些触发回发的事情时 它会向
  • 如何连接字符串和常量字符?

    我需要将 hello world 放入c中 我怎样才能做到这一点 string a hello const char b world const char C string a hello const char b world a b co
  • 不同类型的指针可以互相分配吗?

    考虑到 T1 p1 T2 p2 我们可以将 p1 分配给 p2 或反之亦然吗 如果是这样 是否可以不使用强制转换来完成 或者我们必须使用强制转换 首先 让我们考虑不进行强制转换的分配 C 2018 6 5 16 1 1 列出了简单赋值的约束

随机推荐

  • 使用JSON.parse()转化成json对象需要注意的地方

    相信大部分人都知道或者去百度检索都会得到将js中的字符串转化成json对象常见的3种方法 举例 var str name 小明 age 18 将字符串转化json对象 1 var json JSON parse str 2 var json
  • 一个完整的react router 4.0嵌套路由的例子如下

    react router 4 0以上的路由应用 在4 0以下的react router中 嵌套的路由可以放在一个router标签中 形式如下 嵌套的路由也直接放在一起
  • 可视化探索开源项目的 contributor 关系

    引语 作为国内外最大的代码托管平台 根据最新的 GitHub 数据 它拥有超 372 000 000 个仓库 其中有 28 000 000 是公开仓 分布式图数据库 NebulaGraph 便是其中之一 同其他开源项目一样 NebulaGr
  • python 函数、模块、包及import导入方法

    函数 将一组代码组织到一起 实现某种功能 模块 模块就好比工具包 里面的具体工具就好比函数 需要使用里面的函数 就需要导入这个模块 为实现某种逻辑将相关连的函数写在同一个文件里 使逻辑更清楚 这就是一个模块 在python中文件以 py 结
  • C++11新关键字default

    C 11添加了很多新特性 使C 看上去更加的灵活和面向对象 其中新关键字default值得我们关注一下 我们知道有时候当我们仅创建了有参构造函数后 如果你想调用无参构造函数编译是会报错的 因为一旦你自己定义了构造函数 系统的默认构造函数是被
  • 2022-04-17 Sass学习笔记(二) Sass的语法:变量,条件分支,循环,mixin

    文章目录 1 变量 常见使用场景 语法 示例 2 条件分支 常见使用场景 语法 示例 3 循环 常见使用场景 语法 1 for 指令 2 each 指令 示例一 for循环li节点的样式 示例二 each in节点的样式 4 混合 Mixi
  • maven下载地址

    http archive apache org dist maven binaries
  • 2019matlab安装

    本文转载自Matlab R2019a Win64位 迅雷下载链接 Yohaoa CSDN博客 matlab迅雷下载 和MATLAB 2019a安装教程和破解方法 附Crack文件 我爱分享网 1 下载安装包18G 迅雷磁力链 magnet
  • 前端之浅谈浏览器的垃圾回收机制和内存泄露

    前端之浅谈浏览器的垃圾回收机制和内存泄露 龙波帝国 博客园
  • 安装eclipse启动时报错

    1 在安装eclipse后 点击exe文件时 提示出现错误 记录在log文件中 因为log文件就是日志文件 可以方便我们排查错误 打开log文件 可以看到文件记录了每次出错的时间和错误栈信息 最新一次错误是 ENTRY org eclips
  • ‘cudaThreadSynchronize’ is deprecated

    Problem src gemm c In function time gpu src gemm c 232 9 warning cudaThreadSynchronize is deprecated Wdeprecated declara
  • C++程序中调用exe文件的一种方法

    我们在开发项目时 通常需要通过一个程序调用另一个程序 在这里介绍一中在C 程序中调用exe文件的方法 使用ShellExcecuteEx函数 使用ShellExcecuteEx相对于其他的调用exe的方法 例如 使用system函数 使用e
  • 区块链是生命体、经济体。未来的区块链世界离不开自己的价值尺度建设

    想知道更多区块链技术知识 请百度 链客区块链技术问答社区 链客 有问必答 公有链和联盟链的本质不同 区块链受到大家广泛关注应该是2015年10月 那时候万向在上海搞了一场区块链国际峰会 因为万向在整个金融界比较有影响力 加上 经济学人 在1
  • 如何删除在System中打开的iso文件

    目录 问题 解决方法 弹出DVD驱动器 删除iso文件 问题 在打开iso文件后 我的电脑中突然出现了一个DVD驱动器 如图1 而且原来的iso文件也无法删除 会提示文件在System中打开 如图2 图一 图二 解决方法 弹出DVD驱动器
  • 使用ffmpeg 将MP4格式 或其他格式转为谷歌浏览器可以播放的MP4文件

    场景 在网页上传任意视频格式的文件后 调用系统的ffmpeg 命令对其格式 转化后 发现谷歌浏览器压根无法播放 原因 视频不光区分格式 同一格式还区分编码 对于扩展名相同的视频文件它们的视频的编码可能是不一样的 mp4格式的视频就有3种编码
  • 【bnlearn in Python】Python下载bnlearn包的一些问题

    贝叶斯网络小萌新 请大家多多指教多多关注 文章目录 bnlearn document 下载超时问题 下载指令 证明下载成功 bnlearn document bnlearn包的指南文件见链接 bnlearn document 下载超时问题
  • kmp(看毛片)算法

    别人的两篇博客 传送门1 传送门2 摘录 其中T为主串 P为模式串 其实就是在T中找P 其中next数组存的是 部分匹配值 部分匹配值 就是 前缀 和 后缀 的最长的共有元素的长度 以 ABCDABD 为例 A 的前缀和后缀都为空集 共有元
  • 如何安装使用IP广播?

    步骤一 连接设备到同个局域网 设备连接网络 所有的设备与服务器处于同个局域网内 测试时放在同个交换机内 步骤二 在服务器上安装广播软件 再服务器上安装 数字网络广播系统软件 运行目录下的 Setup exe 文件 一直下一步直到完成 再服务
  • TortoiseSVN使用方法

    安装和配置 TortoiseSVN的下载地址为 http tortoisesvn net downloads html 有32位和64位的版本 一定要根据自己的操作系统下载对应的版本 最好安装一个简体中文的Language packs 可以
  • C++opencv进行图像处理(三)图像的基本操作

    1 图像像素的加法 主要包含了图像的像素加法 当像素增加 会使得图像变亮 当像素减少会使得图像变暗 除法操作会变暗 结果如下所示 左边是原图 右边是像素相加后的 在前面的代码模块中增加的代码为 void QuickDemo pixel op