opencv3/C++图像像素操作详解


Posted in Python onDecember 10, 2019

RGB图像转灰度图

RGB图像转换为灰度图时通常使用:

opencv3/C++图像像素操作详解

进行转换,以下尝试通过其他对图像像素操作的方式将RGB图像转换为灰度图像。

#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;

int main()
{
 //像素操作
 Mat src,dst;
 src = imread("E:/image/image/daibola.jpg");
 if(src.empty())
 {
  printf("can not load image \n");
  return -1;
 }

 namedWindow("input");
 imshow("input",src);

 dst.create(src.size(), src.type());

 for(int row = 0; row < src.rows; row++)
 {
  for(int col = 0; col < src.cols; col++)
  {
   int b = src.at<Vec3b>(row, col)[0];
   int g = src.at<Vec3b>(row, col)[1];
   int r = src.at<Vec3b>(row, col)[2];
   dst.at<Vec3b>(row, col)[0] = max(r,max(g,b));
   dst.at<Vec3b>(row, col)[1] = max(r,max(g,b));
   dst.at<Vec3b>(row, col)[2] = max(r,max(g,b));

  }
 }

 namedWindow("output");
 imshow("output",dst);
 waitKey();

}

opencv3/C++图像像素操作详解

同理使用min(r,min(g,b))可以看到由于选择了较小的灰度值图像会明显变暗:

opencv3/C++图像像素操作详解

图像线性增强

通过对图像像素操作(线性变换),实现图像的线性增强。

#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;

int main()
{
 Mat src1, dst;
 src1 = imread("E:/image/image/im1.jpg");
 if(src1.empty())
 {
  printf("can not load im1 \n");
  return -1;
 }
 double alpha = 1.2, beta = 50;
 dst = Mat::zeros(src1.size(), src1.type());
 for(int row = 0; row < src1.rows; row++)
 {
  for(int col = 0; col < src1.cols; col++)
  {
   if(src1.channels() == 3)
   {
    int b = src1.at<Vec3b>(row, col)[0]; 
    int g = src1.at<Vec3b>(row, col)[1]; 
    int r = src1.at<Vec3b>(row, col)[2]; 

    dst.at<Vec3b>(row, col)[0] = saturate_cast<uchar>(b*alpha + beta); 
    dst.at<Vec3b>(row, col)[1] = saturate_cast<uchar>(g*alpha + beta); 
    dst.at<Vec3b>(row, col)[2] = saturate_cast<uchar>(r*alpha + beta); 
   }
   else if (src1.channels() == 1)
   {
    float v = src1.at<uchar>(row, col); 
    dst.at<uchar>(row, col) = saturate_cast<uchar>(v*alpha + beta);
   }
  }
 }

 namedWindow("output",CV_WINDOW_AUTOSIZE);
 imshow("output", dst);
 waitKey();
 return 0;
}

opencv3/C++图像像素操作详解

opencv3/C++图像像素操作详解

掩膜操作调整图像对比度

使用一个3×3掩模增强图像对比度:

opencv3/C++图像像素操作详解

#include<opencv2/opencv.hpp>
#include<math.h>
using namespace cv;

int main()
{
 Mat src, dst;
 src = imread("E:/image/image/daibola.jpg");
 CV_Assert(src.depth() == CV_8U);
 if(!src.data)
 {
  printf("can not load image \n");
  return -1;
 }

 src.copyTo(dst);
 for(int row = 1; row<(src.rows - 1); row++)
 {
  const uchar* previous = src.ptr<uchar>(row - 1);
  const uchar* current = src.ptr<uchar>(row);
  const uchar* next = src.ptr<uchar>(row + 1);
  uchar* output = dst.ptr<uchar>(row);
  for(int col = src.channels(); col < (src.cols - 1)*src.channels(); col++)
  {
   *output = saturate_cast<uchar>(9 * current[col] - 2*previous[col] - 2*next[col] - 2*current[col - src.channels()] - 2*current[col + src.channels()]);
   output++;
  }
 }

 namedWindow("image", CV_WINDOW_AUTOSIZE);
 imshow("image",dst);
 waitKey();
 return 0;
}

opencv3/C++图像像素操作详解

像素重映射

利用cv::remap实现像素重映射;

cv::remap参数说明:

Remap(
InputArray src,// 输入图像
OutputArray dst,// 输出图像
InputArray map1,// 映射表1(CV_32FC1/CV_32FC2)
InputArray map2,// 映射表2(CV_32FC1/CV_32FC2)
int interpolation,// 选择的插值
int borderMode,// 边界类型(BORDER_CONSTANT)
const Scalar borderValue// 颜色 
)

插值方法:

CV_INTER_NN =0, 
CV_INTER_LINEAR =1, 
CV_INTER_CUBIC =2, 
CV_INTER_AREA =3, 
CV_INTER_LANCZOS4 =4

通过像素重映射实现图像垂直翻转:

#include<opencv2/opencv.hpp>
using namespace cv;

int main()
{
 Mat src,dst;
 src = imread("E:/image/image/daibola.jpg");
 if(src.empty())
 {
  printf("can not load image \n");
  return -1;
 }
 namedWindow("input", CV_WINDOW_AUTOSIZE);
 imshow("input", src);
 Mat mapx,mapy;
 mapx.create(src.size(), CV_32FC1);
 mapy.create(src.size(), CV_32FC1);
 for(int row = 0; row < src.rows; row++)
 {
  for(int col = 0; col < src.cols; col++)
  {
   mapx.at<float>(row, col) = col;
   mapy.at<float>(row, col) = src.rows - row - 1;
  }
 }
 remap(src, dst, mapx, mapy, CV_INTER_NN, BORDER_CONSTANT, Scalar(0,255,255));

 namedWindow("output", CV_WINDOW_AUTOSIZE);
 imshow("output",dst);
 waitKey();
 return 0;
}

opencv3/C++图像像素操作详解

以上这篇opencv3/C++图像像素操作详解就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python模块学习 filecmp 文件比较
Aug 27 Python
常用python数据类型转换函数总结
Mar 11 Python
对Python的Django框架中的项目进行单元测试的方法
Apr 11 Python
微信跳一跳小游戏python脚本
Jan 05 Python
Python实现的排列组合、破解密码算法示例
Apr 12 Python
在PYQT5中QscrollArea(滚动条)的使用方法
Jun 14 Python
Python Pandas分组聚合的实现方法
Jul 02 Python
Flask框架学习笔记之路由和反向路由详解【图文与实例】
Aug 12 Python
Python函数参数类型及排序原理总结
Dec 19 Python
python 用 xlwings 库 生成图表的操作方法
Dec 22 Python
Python如何使用bokeh包和geojson数据绘制地图
Mar 21 Python
python3中的logging记录日志实现过程及封装成类的操作
May 12 Python
Pandas时间序列重采样(resample)方法中closed、label的作用详解
Dec 10 #Python
Python3的unicode编码转换成中文的问题及解决方案
Dec 10 #Python
用OpenCV将视频分解成单帧图片,图片合成视频示例
Dec 10 #Python
python3 webp转gif格式的实现示例
Dec 10 #Python
Spring Cloud Feign高级应用实例详解
Dec 10 #Python
flask 使用 flask_apscheduler 做定时循环任务的实现
Dec 10 #Python
使用opencv将视频帧转成图片输出
Dec 10 #Python
You might like
用PHP+MySql编写聊天室
2006/10/09 PHP
ThinkPHP自动转义存储富文本编辑器内容导致读取出错的解决方法
2014/08/08 PHP
启用Csrf后POST数据时出现的400错误
2015/07/05 PHP
PHP单例模式定义与使用实例详解
2017/02/06 PHP
ThinkPHP Where 条件中常用表达式示例(详解)
2017/03/31 PHP
YII框架行为behaviors用法示例
2019/04/26 PHP
关于php开启错误提示的总结
2019/09/24 PHP
Javascript 更新 JavaScript 数组的 uniq 方法
2008/01/23 Javascript
表单元素事件 (Form Element Events)
2009/07/17 Javascript
一段批量给页面上的控件赋值js
2010/06/19 Javascript
js判断字符长度及中英文数字等
2014/03/19 Javascript
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
js实现星星打分效果的方法
2020/07/05 Javascript
jQuery控制DIV层实现由大到小,由远及近动画变化效果
2015/10/09 Javascript
js基础之DOM中document对象的常用属性方法详解
2016/10/28 Javascript
使用Electron构建React+Webpack桌面应用的方法
2017/12/15 Javascript
基于Vue、Vuex、Vue-router实现的购物商城(原生切换动画)效果
2018/01/09 Javascript
vue-自定义组件传值的实例讲解
2018/09/18 Javascript
js实现通过开始结束控制的计时器
2019/02/25 Javascript
JS实现放大镜效果
2020/09/21 Javascript
express异步函数异常捕获示例详解
2020/11/30 Javascript
[03:57]DOTA2英雄梦之声_第03期_幻影刺客
2014/06/21 DOTA
在Mac OS上使用mod_wsgi连接Python与Apache服务器
2015/12/24 Python
python中nan与inf转为特定数字方法示例
2017/05/11 Python
Python操作mongodb数据库进行模糊查询操作示例
2018/06/09 Python
python实现电脑自动关机
2018/06/20 Python
Python变量访问权限控制详解
2019/06/29 Python
利用css3 translate完美实现表头固定效果
2017/02/28 HTML / CSS
html5贪吃蛇游戏使用63行代码完美实现
2013/06/25 HTML / CSS
Java如何支持I18N?
2016/10/31 面试题
建筑设计所实习生自我鉴定
2013/09/25 职场文书
大学生大二自我鉴定
2013/10/28 职场文书
写演讲稿所需要注意的4个条件
2014/01/09 职场文书
八项规定自查自纠报告及整改措施
2014/10/26 职场文书
2014年实习生工作总结
2014/11/27 职场文书
图文详解nginx日志切割的实现
2022/01/18 Servers