opencv实战2-修改保存图片、像素操作
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-修改保存图片、像素操作相关推荐
- OpenCV实战(4)——像素操作
OpenCV实战(4)--像素操作 0. 前言 1. 图像的基本组成 2. 访问像素值 2.1 修改图像像素 2.2 cv::Mat_ 模板类 2.3 完整代码示例 3. 用指针扫描图像 3.1 图像 ...
- OpenCV二值化图像像素操作
二值化图像像素不是0就是255,数据类型为uchar.所以访问方法是: // 这里inputmat是二值化图像的mat inputmat.at<uchar>(y, x); 判断是否为白色的 ...
- 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, ...
- OpenCV实战(7)——OpenCV色彩空间转换
OpenCV实战(7)--OpenCV色彩空间转换 0. 前言 1. RGB 色彩空间 2. 色彩空间转换 2.1 CIE L*a*b* 色彩空间 2.2 其它色彩空间 3. 用色调.饱和度和亮度表示 ...
- OpenCV实战(2)——OpenCV核心数据结构
OpenCV实战(2)--OpenCV核心数据结构 0. 前言 1. cv::Mat 数据结构 1.1 cv::Mat 简介 1.2 cv::Mat 属性 1.3 完整代码示例 2. 探索 cv::M ...
- OpenCV实战(1)——OpenCV与图像处理基础
OpenCV实战(1)--OpenCV与图像处理基础 0. 前言 1. OpenCV 基础 1.1 安装 OpenCV 1.2 OpenCV 主要模块 1.3 使用 Qt 进行 OpenCV 开发 2 ...
- Python OpenCV像素操作
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 本文转自:opencv学堂 Python OpenCV像素操作 环 ...
- OpenCV Mat数据类型像素操作
转自:http://blog.csdn.net/skeeee/article/details/13297457 OpenCV图像像素操作及效率分析 在计算机视觉应用中,对于图像内容的读取分析是第一步, ...
- OpenCV图像处理学习四,像素的读写操作和图像反差函数操作
一.读写图像 imread 可以指定加载为灰度或者RGB图像 Imwrite 保存图像文件,类型由扩展名决定 二.读写像素 读一个GRAY(灰度图)像素点的像素值(CV_8UC1) Scalar in ...
最新文章
- 深度介绍分布式系统原理与设计
- gitlab升级-(一)安装一台旧版本
- 举例说明html语言的结构,HTML语言的结构
- 红帽启动apache服务器_redhat 启动ssh服务器
- 从零开始搭建spring-cloud(1) ----eureka
- C# FileSystemWatcher文件监控实例
- Django框架是什麼?
- 西门子smartclient怎么用_Smart Client学习体会(一) Smart Client介绍
- C语言中指针的基类型,c – 将指针从一种基类型转换为另一种基类型
- bagging算法_集成学习(Ensemble Learning)——Bagging与Random Forest(1)
- 协同办公OA系统 沉淀企业文化
- 去除地址栏带#的问题
- tensorflow官方中文文档(各种tf函数解释,看这一篇就够了)
- 记一次VS2015安装/卸载以及编译给定程序
- 【洛谷试炼场】洛谷新手村——循环!循环!循环!
- 每日新闻丨阿里巴巴香港IPO指引价每股176港元左右;全球超级计算机500强榜单出炉...
- tif怎么转换成jpg格式
- linux清理dns缓存命令,Ubuntu下清空DNS缓存 提升访问速度
- 手机开热点如何查看接入热点的所有ip
- \t\t【团队精神】荣辱与共 交流分享 精诚协作 尊重理解 ——程序员应知
热门文章
- 探索数藏未来 秦储数字藏品座谈会成功召开
- CBOW与Skip-Gram
- 美国音乐学院计算机音乐专业排名2015年,美国音乐学校排名Top100
- python 采用to_csv保存数据不覆盖原有数据到文件中
- 百度百科首页登录入口在哪,个人如何创建百度百科
- QXRService:高通SnapdragonXR OpenXR SDK v1.x 概略
- speedoffice(Word)如何给文字添加下划线
- TSOJ 好好做题(屑)——递推状态压缩+高精度
- 成功解决:配置nginx反向代理不正确导致验证码失效的问题
- NeuroImage:暴力的隐式创伤—异常运动振荡脑活动与创伤后应激症状有关