1 加载修改保存图像

1.1 修改图像

opencv中 灰度图像由常量 CV_8U 表示 C++ 中的 unsigned char;

三通道图像由 常量 CV_8UC3 表示;

1.2 保存图像

#include<stdio.h>
#include <cstdio>
#include <iostream>
#include <opencv2/opencv.hpp>
#include  <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{Mat image;image = cv::imread("F:/project/OPENCV_TEST_PROJECT/picture/test.jpg");if (image.empty()) {cout << "error";return 0;}cv::namedWindow("Original Image");cv::imshow("Original Image",image);Mat result;cv::flip(image,result,1);//反转图片 正数表示水平 ;0 表示垂直;负数表示水平和垂直cv::namedWindow("Flip Image");cv::imshow("Flip Image", result);cv::imwrite("F:/project/OPENCV_TEST_PROJECT/picture/flip.jpg", result);//保存结果cv::waitKey(0);//0 表示等待按键
}

1.3 在图片上绘制形状或添加文字

#include<stdio.h>
#include <cstdio>
#include <iostream>
#include <opencv2/opencv.hpp>
#include  <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{Mat image;image = cv::imread("F:/project/OPENCV_TEST_PROJECT/picture/test.jpg");if (image.empty()) {cout << "error";return 0;}cv::namedWindow("Original Image");cv::imshow("Original Image",image);cv::circle(image, cv::Point(155, 110), //中心点坐标55, //半径0,  //颜色3);//厚度cv::namedWindow("Result Image");cv::imshow("Result Image", image);cv::waitKey(0);//0 表示等待按键
}

可使用 cv::putText 函数在图片上添加文字。

1.4 定义感兴趣区域ROI

#include<stdio.h>
#include <cstdio>
#include <iostream>
#include <opencv2/opencv.hpp>
#include  <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
int main()
{Mat image;image = cv::imread("F:/project/OPENCV_TEST_PROJECT/picture/test.jpg");if (image.empty()) {cout << "error";return 0;}//创建一个240*330 红色图像 通道是bgrMat image2(500,330,CV_8UC3,cv::Scalar(0,0,255));//在图像的右下角定义一个感兴趣区域Mat imageROI(image,cv::Rect(image.cols - image2.cols,  //ROI坐标image.rows - image2.rows,image2.cols, image2.rows));  //ROI 大小//插入image2.copyTo(imageROI);cv::namedWindow("Original Image");cv::imshow("Original Image", image);cv::waitKey(0);//0 表示等待按键
}

显示效果如下所示,原图上增加 红色矩阵:

2 像素操作

2.1 使用指针的方式操作图像

获取一行像素值的字节数

int nc = image.cols * images.channels();

返回一行元素的起始地址

uchar * data = image.ptr<uchar>(j);//j为第j行的地址

操作像素的字节

*data = *data/8;

对原图像进行拷贝

cv::Mat iamgeClone = image.clone();//图像的深拷贝

使用迭代器遍历图像元素

cv::Mat<cv::Vec3b>::iterator it = image.begin<cv::Vec3b>();
cv::Mat<cv::Vec3b>::iterator itend = image.end<cv::Vec3b>();
for(;it!=itend;++it)
{(*it)[0] = 112;//[]中访问元素通道(*it)[1] = 255;//[]中访问元素通道(*it)[2] = 255;//[]中访问元素通道
}

2.2 访问图像元素

生成椒盐噪声:

#include<stdio.h>
#include <cstdio>
#include <iostream>
#include <opencv2/opencv.hpp>
#include  <opencv2/highgui.hpp>
using namespace cv;
using namespace std;
#include <random>
void salt(cv::Mat image, int n) { //待处理如下,生成的椒盐噪声数量std::random_device seed_device;std::default_random_engine engine(seed_device());//通过operator()取得设备产生的随机值std::uniform_int_distribution<int> distrRow(0, image.rows -1);//10到100,int类型,线性分布std::uniform_int_distribution<int> distrCols(0, image.cols - 1);//10到100,int类型,线性分布int i, j;for (int k = 0; k < n; k++) {i = distrRow(engine);j = distrCols(engine);if (image.type() == CV_8UC1) {  //灰度图image.at<uchar>(i, j) = 255;}else if (image.type() == CV_8UC3) {  //灰度图image.at<cv::Vec3b>(i, j)[0] = 255;image.at<cv::Vec3b>(i, j)[1] = 255;image.at<cv::Vec3b>(i, j)[2] = 255;}}engine.seed(); //将引擎设为初始化状态cv::namedWindow("Original Image");cv::imshow("Original Image", image);
}

使用Mat.at方法访问元素,at方法被实现成一个模板方法,调用时必须指定图像元素的类型。

image.at<cv::Vec3b>(i, j)[0] = 255;

2.3 计算某段代码运行的时间

const int64 start = cv::getTickCount();//获取计算机开机到当前的时钟周期数
//运行一段代码
double duration = (cv::getTickCount()-start)/cv::getTickFrequency();//换算为以秒为单位

2.4 扫描图像并访问相邻元素

滤波函数 cv::filter2D,定义内核kernel

void sharpen2D(const cv::Mat &image,cv::Mat &result)
{cv::Mat kernel(3,3,CV_32F,cv::Scalar(0));//构造内核,所有入口初始化为0//对内核赋值kernel.at<float>(1,1)=5.0;kernel.at<float>(0,1)=-1.0;kernel.at<float>(2,1)=-1.0;kernel.at<float>(1,0)=-1.0;kernel.at<float>(1,2)=-1.0;//对图像滤波操作cv::filter2D(image,result,image.depth(),kernel);
}

opencv实战2-修改保存图片、像素操作相关推荐

  1. OpenCV实战(4)——像素操作

    OpenCV实战(4)--像素操作 0. 前言 1. 图像的基本组成 2. 访问像素值 2.1 修改图像像素 2.2 cv::Mat_ 模板类 2.3 完整代码示例 3. 用指针扫描图像 3.1 图像 ...

  2. OpenCV二值化图像像素操作

    二值化图像像素不是0就是255,数据类型为uchar.所以访问方法是: // 这里inputmat是二值化图像的mat inputmat.at<uchar>(y, x); 判断是否为白色的 ...

  3. OpenCV图像处理学习六,像素操作,使用line,ellipse,ellipse,rectangle,fillPoly函数绘制线、矩形、圆、椭圆等基本图形以及C++随机数产生器RNG的应用

    一.Point与Scalar 使用cv::Point与cv::Scalar Point表示2D平面上一个点x,y Point p; p.x = 10; p.y = 8; 或者 p = Pont(10, ...

  4. OpenCV实战(7)——OpenCV色彩空间转换

    OpenCV实战(7)--OpenCV色彩空间转换 0. 前言 1. RGB 色彩空间 2. 色彩空间转换 2.1 CIE L*a*b* 色彩空间 2.2 其它色彩空间 3. 用色调.饱和度和亮度表示 ...

  5. OpenCV实战(2)——OpenCV核心数据结构

    OpenCV实战(2)--OpenCV核心数据结构 0. 前言 1. cv::Mat 数据结构 1.1 cv::Mat 简介 1.2 cv::Mat 属性 1.3 完整代码示例 2. 探索 cv::M ...

  6. OpenCV实战(1)——OpenCV与图像处理基础

    OpenCV实战(1)--OpenCV与图像处理基础 0. 前言 1. OpenCV 基础 1.1 安装 OpenCV 1.2 OpenCV 主要模块 1.3 使用 Qt 进行 OpenCV 开发 2 ...

  7. Python OpenCV像素操作

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...

  8. OpenCV Mat数据类型像素操作

    转自:http://blog.csdn.net/skeeee/article/details/13297457 OpenCV图像像素操作及效率分析 在计算机视觉应用中,对于图像内容的读取分析是第一步, ...

  9. OpenCV图像处理学习四,像素的读写操作和图像反差函数操作

    一.读写图像 imread 可以指定加载为灰度或者RGB图像 Imwrite 保存图像文件,类型由扩展名决定 二.读写像素 读一个GRAY(灰度图)像素点的像素值(CV_8UC1) Scalar in ...

最新文章

  1. 深度介绍分布式系统原理与设计
  2. gitlab升级-(一)安装一台旧版本
  3. 举例说明html语言的结构,HTML语言的结构
  4. 红帽启动apache服务器_redhat 启动ssh服务器
  5. 从零开始搭建spring-cloud(1) ----eureka
  6. C# FileSystemWatcher文件监控实例
  7. Django框架是什麼?
  8. 西门子smartclient怎么用_Smart Client学习体会(一) Smart Client介绍
  9. C语言中指针的基类型,c – 将指针从一种基类型转换为另一种基类型
  10. bagging算法_集成学习(Ensemble Learning)——Bagging与Random Forest(1)
  11. 协同办公OA系统 沉淀企业文化
  12. 去除地址栏带#的问题
  13. tensorflow官方中文文档(各种tf函数解释,看这一篇就够了)
  14. 记一次VS2015安装/卸载以及编译给定程序
  15. 【洛谷试炼场】洛谷新手村——循环!循环!循环!
  16. 每日新闻丨阿里巴巴香港IPO指引价每股176港元左右;全球超级计算机500强榜单出炉...
  17. tif怎么转换成jpg格式
  18. linux清理dns缓存命令,Ubuntu下清空DNS缓存 提升访问速度
  19. 手机开热点如何查看接入热点的所有ip
  20. \t\t【团队精神】荣辱与共 交流分享 精诚协作 尊重理解 ——程序员应知

热门文章

  1. 探索数藏未来 秦储数字藏品座谈会成功召开
  2. CBOW与Skip-Gram
  3. 美国音乐学院计算机音乐专业排名2015年,美国音乐学校排名Top100
  4. python 采用to_csv保存数据不覆盖原有数据到文件中
  5. 百度百科首页登录入口在哪,个人如何创建百度百科
  6. QXRService:高通SnapdragonXR OpenXR SDK v1.x 概略
  7. speedoffice(Word)如何给文字添加下划线
  8. TSOJ 好好做题(屑)——递推状态压缩+高精度
  9. 成功解决:配置nginx反向代理不正确导致验证码失效的问题
  10. NeuroImage:暴力的隐式创伤—异常运动振荡脑活动与创伤后应激症状有关