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 性能优化技巧总结
Nov 01 Python
Python实现简单过滤文本段的方法
May 24 Python
Python使用matplotlib的pie函数绘制饼状图功能示例
Jan 08 Python
pandas apply 函数 实现多进程的示例讲解
Apr 20 Python
详解pyqt5 动画在QThread线程中无法运行问题
May 05 Python
Python解决线性代数问题之矩阵的初等变换方法
Dec 12 Python
使用python切片实现二维数组复制示例
Nov 26 Python
python匿名函数lambda原理及实例解析
Feb 07 Python
QML实现钟表效果
Jun 02 Python
Python Socket TCP双端聊天功能实现过程详解
Jun 15 Python
Python Socket多线程并发原理及实现
Dec 11 Python
PyTorch dropout设置训练和测试模式的实现
May 27 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
星际争霸 Starcraft 发展史
2020/03/14 星际争霸
PHP 中执行排序与 MySQL 中排序
2009/04/21 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
thinkphp项目部署到Linux服务器上报错“模板不存在”如何解决
2016/04/27 PHP
PHP7内核CGI与FastCGI详解
2019/04/14 PHP
浏览器无法运行JAVA脚本的解决方法
2008/01/09 Javascript
如何确保JavaScript的执行顺序 之jQuery.html并非万能钥匙
2011/03/03 Javascript
js中键盘事件实例简析
2015/01/10 Javascript
jQuery简单获取键盘事件的方法
2016/01/22 Javascript
JS实现根据用户输入分钟进行倒计时功能
2016/11/14 Javascript
vue.js将unix时间戳转换为自定义时间格式
2017/01/03 Javascript
AngularJS 中ui-view传参的实例详解
2017/08/25 Javascript
推荐10款扩展Web表单的JS插件
2017/12/25 Javascript
jquery+css3实现熊猫tv导航代码分享
2018/02/12 jQuery
使用bootstrap实现下拉框搜索功能的实例讲解
2018/08/10 Javascript
微信小程序登录按钮遮罩浮层效果的实现方法
2018/12/16 Javascript
JS实现的获取银行卡号归属地及银行卡类型操作示例
2019/01/08 Javascript
[02:16]卖萌的僵尸 DOTA2神话信使飞僵小宝来袭
2014/03/24 DOTA
[00:34]拔城逐梦,热血永恒!2020(秋)完美世界城市挑战赛报名开启
2020/10/09 DOTA
python列表与元组详解实例
2013/11/01 Python
Python中的zipfile模块使用详解
2015/06/25 Python
python中的内置函数max()和min()及mas()函数的高级用法
2018/03/29 Python
pyftplib中文乱码问题解决方案
2020/01/11 Python
python matplotlib中的subplot函数使用详解
2020/01/19 Python
python+selenium定时爬取丁香园的新型冠状病毒数据并制作出类似的地图(部署到云服务器)
2020/02/09 Python
python 瀑布线指标编写实例
2020/06/03 Python
Python变量格式化输出实现原理解析
2020/08/06 Python
python opencv实现简易画图板
2020/08/27 Python
Otticanet澳大利亚:最顶尖的世界名牌眼镜, 能得到打折季的价格
2018/08/23 全球购物
Fossil美国官网:化石手表、手袋、首饰及配饰
2019/02/17 全球购物
自荐信不宜过于夸大
2013/11/06 职场文书
出纳担保书范文
2014/04/02 职场文书
个人创业事迹材料
2014/12/30 职场文书
单位接收证明格式
2015/06/18 职场文书
在Windows下安装配置CPU版的PyTorch的方法
2021/04/02 Python
JavaScript嵌入百度地图API的最详细方法
2021/04/16 Javascript