五、图像像素算术操作

算术操作无非就是像数值之间的加减乘除操作

一、创建图像像素算术操作——头文件

在项目的头文件中,右击添加新建项
在这里插入图片描述

创建用于图像像素算术操作的头文件,我这边是operater.h
在这里插入图片描述
该头文件声明了一个Operater类(class Operater),该类下面声明一个函数(void mat_operater(Mat& image))

operater.h头文件内容如下:

#pragma once#include <opencv2/opencv.hpp>using namespace cv;class Operater {
public:void mat_operater(Mat& image);
};

二、创建图像像素算术操作——函数实现

创建个文件,用于实现头文件中Operater 类中的mat_operater函数
我这个文件是:operate.cpp
在这里插入图片描述
在这里插入图片描述
#include"operater.h",导入自定义的头文件
Mat hjj,result;,定义两个matrix,hjj为需要改变的像数值,result为改变之后的最终结果
Mat::zeros(image.size(), image.type());,初始化成和原始图像image大小规格一致
hjj = Scalar(50, 50, 50);,对原始图像三通道都操作50哥像数值

add(image, hjj, result); ,加法操作
参数一:原始图片
参数二:要改变多少像数值
参数三:最终的结果
这里就是:对image图像进行加hjj这么多像数值,最终的输出结果为result
当然加减乘除都类似,add、subtract、multiply、divide

imshow("opreate_show", result);,展示一下最终的图像

#include"operater.h"
#include <iostream>
#include <opencv2/opencv.hpp>void Operater::mat_operater(Mat& image) {Mat hjj,result;hjj = Mat::zeros(image.size(), image.type());result = Mat::zeros(image.size(), image.type());hjj = Scalar(50, 50, 50);add(image, hjj, result);     //加法操作/*	subtract(image, hjj, result);//减法操作multiply(image, hjj, result);//乘法操作divide(image, hjj, result);  //除法操作*/namedWindow("opreate_show", WINDOW_FREERATIO);imshow("opreate_show", result);waitKey(0);destroyAllWindows();
}

补充:上述都是直接调用OpenCV的函数,下面简述下add函数的大致实现思路,下面的代码与上述直接调用API效果相同,当然肯定没有直接调用API效果好,这里只是演示下实现的思路
详细可参考博文:四、图像像素读写操作

saturate_cast<uchar>(bgr[0] + p[0]);,因为是像数值相加,可能会越界,故通过函数saturate_cast进行限制,超过255的值一律按255进行处理

#include"operater.h"
#include <iostream>
#include <opencv2/opencv.hpp>void Operater::mat_operater(Mat& image) {Mat hjj,result;hjj = Mat::zeros(image.size(), image.type());result = Mat::zeros(image.size(), image.type());hjj = Scalar(50, 50, 50);int h = image.rows;int w = image.cols;int dims = image.channels();for (int row = 0; row < h; row++) {for (int col = 0; col < w; col++) {Vec3b bgr = image.at<Vec3b>(row, col);Vec3b p = hjj.at<Vec3b>(row, col);result.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(bgr[0] + p[0]);result.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(bgr[1] + p[1]);result.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(bgr[2] + p[2]);}}namedWindow("opreate_show", WINDOW_FREERATIO);imshow("opreate_show", result);waitKey(0);destroyAllWindows();
}

三、创建图像像素算术操作——主函数调用

同理,创建一个cpp文件,我这里以yy_main.cpp为例,作为程序执行入口,调用所实现的方法。
在这里插入图片描述
在这里插入图片描述
#include "operater.h"",导入自定义的头文件
Operater yy;;,对这个类进行赋予对象
yy.mat_operater(src);,调用这个类中的mat_operater函数

#include <opencv2/opencv.hpp>
#include <iostream>
#include "operater.h"using namespace cv;
using namespace std;int main(int argc, char** argv) {Mat src = cv::imread("E:/C++_workspace/beyond.jpg", IMREAD_COLOR);if (src.empty()) {printf("load image is false...\n");return -1;}namedWindow("yanyu", WINDOW_FREERATIO);imshow("yanyu", src);Operater yy;yy.mat_operater(src);waitKey(0);destroyAllWindows();return 0;
}

项目结构如下:
在这里插入图片描述
运行结果如下:
在这里插入图片描述
左边为原图,右边为所有像素点值+50之后的图像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/450288.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

海康威视有插件、无插件播放;webrtc直播;西瓜视频播放器;mpegts.js直播;flvjs直播

Notes 视频播放的几种方式 一、Video mp4链接直接播放 二、海康威视3.3插件版直播、云台控制&#xff0c;资源下载地址 index.html引入hk文件中的js文件双击HCWebSDKPlugin.exe安装插件前端参照文件夹hkCamera中的示例代码 三、海康威视3.2无插件版直播&#xff0c;资源下…

Linux---进程间通信 | 管道 | PIPE | MKFIFO | 共享内存 | 消息队列

管道 管道是UNIX中最古老的进程间通信的形式&#xff0c;我们把从一个进程连接到另一个进程的数据流称为一个管道。 一个文件&#xff0c;可以被多个进程打开吗&#xff1f;可以&#xff0c;那如果一个进程打开文件&#xff0c;往文件里面写数据&#xff0c;另一个进程打开文…

【服务器】RAID(独立磁盘冗余阵列)

RAID&#xff08;独立磁盘冗余阵列&#xff09; 一、RAID的介绍二、RAID的分类#2-1 RAID 02-2 RAID 1#2-3 RAID 32-4 RAID 52-5 RAID 62-6 RAID 10(先做镜像&#xff0c;再做条带化)2-7 RAID 01&#xff08;先做条带&#xff0c;再做镜像&#xff09;2-8 RAID比较 三、磁盘阵列…

设备的层次结构 - 驱动程序的复杂层次结构

由于设备对象的水平结构和垂直结构&#xff0c;组成了Windows设备的树形结构图。在Windows中出事的时候会有一个根设备&#xff0c;为了理解简单&#xff0c;我们将PCI总线想象成根总线&#xff08;根总线其实不是PCI总线&#xff0c;只是为了理解方便&#xff09;。查到PCI总线…

【云原生】Docker如何构建镜像

目录 前言 一、基于已有的镜像创建 步骤一&#xff1a;先基于现有的镜像创建一个容器&#xff0c;然后进入容器去完成修改 步骤二&#xff1a;将该容器作为一个模板提交创建为一个新的镜像 步骤三&#xff1a;基于新的镜像&#xff0c;docker run创建一个容器&#xff0c;进…

leetcode刷题(剑指offer) 297.二叉树的序列化和反序列化

297.二叉树的序列化与反序列化 序列化是将一个数据结构或者对象转换为连续的比特位的操作&#xff0c;进而可以将转换后的数据存储在一个文件或者内存中&#xff0c;同时也可以通过网络传输到另一个计算机环境&#xff0c;采取相反方式重构得到原数据。 请设计一个算法来实现…

C#,雅各布斯塔尔—卢卡斯(Jacobsthal Lucas Number)的算法与源代码

1 雅各布斯塔尔序列 雅各布斯塔尔序列是一个与斐波那契序列类似的加法序列&#xff0c;由递归关系JnJn-12Jn-2定义&#xff0c;初始项J00&#xff0c;J11。序列中的一个数字称为雅可布沙尔数。它们是卢卡斯序列Un&#xff08;P&#xff0c;Q&#xff09;的一种特殊类型&#x…

【CSS】文本溢出省略的两种方式

【CSS】文本溢出省略的两种方式 假设有一个卡片组件&#xff0c;组件里的内容有长有短&#xff0c;我们希望在内容很长的时候省略文字&#xff0c;以保证卡片的高度不会过高。 单行文本 要实现在文字超出时不显示超出部分&#xff0c;并用省略号表示还有更多文字&#xff0…

alibabacloud学习笔记05(小滴课堂)

高并发下的微服务存在的问题 高并发下的微服务容错方案 介绍什么是分布式系统的流量防卫兵Sentinel 微服务引入Sentinel和控制台搭建 每个服务都加上这个依赖。 启动方式&#xff1a; 讲解AliababCloud微服务整合Sentinel限流配置实操 我们在order和video模块都加上。 分别启动…

【数据结构】二叉树链式结构的实现

简单不先于复杂&#xff0c;而是在复杂之后。 文章目录 1. 二叉树链式结构的实现1.1 前置说明1.2 二叉树的遍历1.2.1 前序、中序以及后序遍历1.2.2 层序遍历 1.3 节点个数以及高度等1.4 二叉树基础oj练习1.5 二叉树的创建和销毁 1. 二叉树链式结构的实现 1.1 前置说明 在学习二…

【python】python爱心代码

一、实现效果&#xff1a; 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 二、准备工作 &#xff08;1)、导入必要的模块&#xff1a; 代码首先导入了需要使用的模块&#xff1a;requests、lxml和csv。 import requests from lxml import etree import csv 如果出现…

Autosar 网络管理 NM

为什么要网络管理 Autosar网络管理之所以重要&#xff0c;可以用比较通俗的话来解释&#xff1a; 想象一下汽车是一个庞大的交流团队&#xff0c;每个成员都是一部分的电子控制单元&#xff08;ECU&#xff09;。这些成员之间需要不断地交换信息&#xff0c;就像团队成员需要…