opencv3/C++图像像素操作详解
作者:阿卡蒂奥 发布时间:2021-04-23 08:29:26
标签:opencv3,C++,图像,像素
RGB图像转灰度图
RGB图像转换为灰度图时通常使用:
进行转换,以下尝试通过其他对图像像素操作的方式将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();
}
同理使用min(r,min(g,b))可以看到由于选择了较小的灰度值图像会明显变暗:
图像线性增强
通过对图像像素操作(线性变换),实现图像的线性增强。
#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;
}
掩膜操作调整图像对比度
使用一个3×3掩模增强图像对比度:
#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;
}
像素重映射
利用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;
}
来源:https://blog.csdn.net/akadiao/article/details/78836384


猜你喜欢
- function commafy() { var num = document.getElementById("NumA"
- 前言众所周知Python不像JS或者PHP这种弱类型语言里在字符串连接时会自动转换类型,如果直接将字符串和数字拼接会直接报错。如以下的代码:
- 这篇文章主要介绍了python基于property()函数定义属性,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价
- 本文实例讲述了使用symfony命令创建项目的方法。分享给大家供大家参考,具体如下:概况这一章节描述一个Symfony项目的合理结构框架,并
- 如何巧用三元表达式一开始我并不喜欢阅读别人的代码,话说程序员最讨厌的事:写代码要写文档、写代码要写注释、别人的代码没有文档、别人的代码没有注
- label与one-hot之间的互相转换有时候需要label,比如强化学习的离散动作空间,输出动作索引;有时候需要one-hot,比如训练数
- 在用Linux(OS:Centos 7.2)时看到有一行代码是:export PYTHONPATH=$PYTHONPATH:/home/us
- 前言:并行编程比程序编程困难,除非正常编程需要创建大量数据,计算耗时太长,物理行为模拟困难例子:N体问题物理前提:牛顿定律时间离散运动方程普
- 概念json是一种通用的数据类型一般情况下接口返回的数据类型都是json长得像字典,形式也是k-v{ }其实json是字符串字符串不能用ke
- 新的 Python 版本推出了有趣的新功能。Python 是当今最流行的编程语言之一。它有广泛的领域和应用,从学习计算机科学的基础,到执行复
- 我想要的结果无非是去掉URL路径中的index.php首先是配置.htaccess<IfModule mod_rewrite.c>
- 本文章面向有一定基础的python学习者,使用Pygame包开发一款简单的游戏首先打开命令行,使用PyPI下载Pygame包(输入命令pip
- 什么是PromisePromise 是异步编程的一种解决方案,其实是一个构造函数,自己身上有all、reject、resolve这几个方法,
- 1. 概述每个 Vue 实例在被创建之前都要经过一系列的初始化过程。例如需要设置数据监听、编译模板、挂载实例到 DOM、在数据变化时更新 D
- 本文实例为大家分享了JavaScript实现多层颜色选项卡嵌套的具体代码,供大家参考,具体内容如下这是学JavaScript时候的一个作业,
- 对url进行编码在服务器端我们可以使用asp中的server.urlencode,很方便实现。如:<% ss="asp之家欢
- 前言最近完整地看了一遍TypeScript的官方文档,发现文档中有一些知识点没有专门讲解到,或者是讲解了但却十分难以理解,因此就有了这一系列
- python的smtplib提供了一种很方便的途径发送电子邮件。它对smtp协议进行了简单的封装。下面是一个利用smtplib,实现QQ邮箱
- 前言开发过程中有时需要使用路径数据,虽然python有自己的svg或其他矢量库,但这里只是出于实验的目的,没必要深入研究,所以采用一些简单的
- 需求是这样的,我从本科到现在硬盘里存了好多照片,本来是按类别分的,有一天,我突然想,要是能按照时间来分类可能会更好。可以右键查看照片的属性,