一、颜色空间缩减

1、概念

如果图像是3通道,深度为1个字节,则每个像素有256*256*256种可能值,这么多的可能值会对算法性能造成严重影响。利用颜色空间缩减就能解决这个问题,例如将颜色值0~9取为新值0,10~19取为10,以此类推,这样每个像素有26*26*26种可能值,比上面的可能值要小很多。

2、公式

P_New = ( P_Old / divide ) * divide   (P表示像素值)

3、处理

如果对原图像每个像素都进行上面的公式运算,运算量将非常大。可以将0~255这256种情况对应的新值计算出来,存放在table中,然后将原图像的像素值按照table表取出新值即可。

uchar table[256];

for( int i=0; i<256; i++ )

  table[i] = ( i / divide ) * divide;

P_New = table[ P_New ];

4、LUT函数

OpenCV提供了LUT函数帮我们完成上面的处理。

示例:

 Mat srcImage = imread("test.jpg");

 Mat lookUpTable(,,CV_8U);
uchar* p = lookUpTable.data;
for(int i=; i<; i++)
{
p[i] = i/*;
} Mat destImage;
destImage.create(srcImage.size(),srcImage.type()); LUT(srcImage,lookUpTable,destImage); imshow("srcImage",srcImage);
imshow("destImage",destImage);

二、图像叠加

 Mat srcImage = imread("E:\\CodeResource\\opencv\\car_pic\\test.jpg");
Mat logoImage = imread("E:\\CodeResource\\opencv\\car_pic\\logo.png"); //255或者1都行,只要非0就行
Mat mask(logoImage.size(),CV_8UC1,Scalar::all());
Rect r1(,,mask.cols,);
mask(r1).setTo(); //设置感兴趣区域
Mat roiImage = srcImage(Rect(, , logoImage.cols, logoImage.rows));
logoImage.copyTo(roiImage, mask); imshow("srcImage", srcImage);
waitKey();

三、线性混合操作

1、概念

线性混合操作是一种典型的二元(两个输入)的像素操作,它的理论公式如下:

g(x) = (1-a)f1(x) + af2(x)

我们通过在范围0~1间改变alpha值,来对两幅图像产生时间上的叠加效果。

2、示例

 //图像线性混合demo
Mat srcImage = imread("E:\\CodeResource\\opencv\\car_pic\\test.jpg");
Mat rainImage = imread("E:\\CodeResource\\opencv\\car_pic\\rain.bmp"); double alphaValue = 0.5;
double betaValue = (1.0 - alphaValue); //两个叠加的图片大小需一样
Mat destImage = srcImage(Rect(,,rainImage.cols,rainImage.rows)); //alpha表示第一个数组的权重
//betaValue表示第二个数组的权重
//0.0表示加到权重总和上的标量值
addWeighted(destImage,alphaValue,rainImage,betaValue,0.0,destImage); imshow("srcImage",srcImage);

四、通道分离和混合

1、概述

有时为了更好地分析图像,需要对图像的通道进行分别处理和调整,通过通道分离函数split和通道混合函数merge能够很方便地达到目的。

2、示例

 //图像通道分离和混合demo
Mat srcImage = imread("E:\\CodeResource\\opencv\\car_pic\\test.jpg"); vector<Mat> channels;
//通道分离
split(srcImage, channels);
Mat imageDest = channels.at();
//通道混合
merge(channels, imageDest); imshow("imageDest", imageDest);

五、图像对比度和亮度调整

1、算子

图像对比度和亮度调整的算子如下:

g(x) = a*f(x) + b

其中:

(1)f(x)表示源图像

(2)g(x)表示输出图像

(3)a称为增益(gain),用来控制图像的对比度

(4)b称为偏置(bias),用来控制图像的亮度

2、示例

 #include <opencv/cv.h>
#include <opencv2/highgui.hpp> using namespace cv; #include <vector>
using namespace std; int g_nConstrast;
int g_nBright;
Mat srcImage;
Mat dstImage; void ShowResult()
{
for (int y = ; y < srcImage.rows; y++)
{
for (int x = ; x < srcImage.cols; x++)
{
for (int nChannel = ; nChannel < ; nChannel++)
{
dstImage.at<Vec3b>(y, x)[nChannel] =
saturate_cast<uchar>((g_nConstrast*0.01)*(srcImage.at<Vec3b>(y, x)[nChannel]) + g_nBright);
}
}
}
imshow("srcImage", srcImage);
imshow("dstImage", dstImage);
} void OnConstrast(int nValue, void *)
{
g_nConstrast = nValue;
ShowResult();
} void OnBright(int nValue, void *)
{
g_nBright = nValue;
ShowResult();
} int main()
{
srcImage = imread("test.jpg");
dstImage.create(srcImage.size(), srcImage.type()); g_nConstrast = ;
g_nBright = ; namedWindow("srcImage", );
namedWindow("dstImage",); createTrackbar("对比度:", "dstImage", &g_nConstrast, , OnConstrast);
createTrackbar("亮度:", "dstImage", &g_nBright, , OnBright); ShowResult(); while (char(waitKey()) != 'q') {}
return ;
}

OpenCV3编程入门-读书笔记2-core组件的更多相关文章

  1. OpenCV3编程入门读书笔记5-边缘检测

    一.边缘检测的一般步骤 1.滤波 边缘检测的算法主要是基于图像强度的一阶和二阶导数,但导数通常对噪声很敏感,因此必须采用滤波器来改善与噪声有关的边缘检测器的性能. 2.增强 增强边缘的基础是确定图像各 ...

  2. OpenCV3编程入门-读书笔记1

    一.OpenCV概述 1.OpenCV全程Open Source Computer Vision Library,即开源计算机视觉库.它是一个跨平台的开源计算机视觉库,可以运行在windows.lin ...

  3. OpenCV3编程入门读书笔记4-形态学滤波

    一.腐蚀和膨胀 1.腐蚀和膨胀的主要功能 (1)消除噪声 (2)分割出独立的图像元素,在图像中连接相邻的元素 (3)寻找图像中的极大值或者极小值区域 (4)求出图像的梯度 2.膨胀(dilate) 膨 ...

  4. OpenCV3编程入门-读书笔记3-滤波

    一.领域滤波(卷积) 邻域算子值利用给定像素周围像素的值决定此像素的最终输出.如图左边图像与中间图像卷积得到右边图像.目标图像中绿色的像素由原图像中蓝色标记的像素计算得到. 通用线性邻域滤波是一种常用 ...

  5. opencv3 编程入门学习笔记(一): 基本函数介绍

    滤波 blur (均值滤波) 均值滤波是典型的线性滤波算法, 主要方法为领域平均法(即用一片图像区域的各个像素的平均值来代替原图像中的各个像素值) 缺点: 不能很好的保护图像细节, 在图像去噪的同时也 ...

  6. 【浅墨著作】《OpenCV3编程入门》内容简单介绍&amp;勘误&amp;配套源码下载

    经过近一年的沉淀和总结,<OpenCV3编程入门>一书最终和大家见面了. 近期有为数不少的小伙伴们发邮件给浅墨建议最好在博客里面贴出这本书的文件夹,方便大家更好的了解这本书的内容.事实上近 ...

  7. 《C#高级编程》读书笔记

    <C#高级编程>读书笔记 C#类型的取值范围 名称 CTS类型 说明 范围 sbyte System.SByte 8位有符号的整数 -128~127(−27−27~27−127−1) sh ...

  8. 第三章 Git的入门 - 读书笔记

    Android驱动月考3 第三章 Git的入门 - 读书笔记 对于Github,这是全世界最大的开源平台,你可以把你做的项目在这里开源,把你发现的一些新技术在这里开源,向全世界的开发者们分享,大家都彼 ...

  9. 《Windows核心编程》读书笔记 上

    [C++]<Windows核心编程>读书笔记 这篇笔记是我在读<Windows核心编程>第5版时做的记录和总结(部分章节是第4版的书),没有摘抄原句,包含了很多我个人的思考和对 ...

随机推荐

  1. Elasticsearch通关教程(五):如何通过SQL查询Elasticsearch

    前言 这篇博文本来是想放在全系列的大概第五.六篇的时候再讲的,毕竟查询是在索引创建.索引文档数据生成和一些基本概念介绍完之后才需要的.当前面的一些知识概念全都讲解完之后再讲解查询是最好的,但是最近公司 ...

  2. Spring Boot JPA Entity Jackson序列化触发懒加载的解决方案

    Spring Jpa这项技术在Spring 开发中经常用到. 今天在做项目用到了Entity的关联懒加载,但是在返回Json的时候,不管关联数据有没有被加载,都会触发数据序列化,而如果关联关系没有被加 ...

  3. Git和Gitlab在使用过程中所遇到的问题

    01-关于gitLab添加ssh key后,git clone还提示输入密码问题 本地用户连接远程仓库需要用 HTTP方式连接,SSH方式会出现提示输入密码 git clone http://.... ...

  4. Linux中什么是动态网站环境及如何部署

    当谈论起网站时,我们可能听说过静态和动态这两个词,但却不知道它们的含义,或者从字面意思了解一些却不知道它们的区别. 这一切可以追溯到网站和网络应用程序,Web应用程序是一个网站,但很多网站不是Web应 ...

  5. PHP获取项目所有控制器方法名称

    PHP获取项目所有控制器方法名称 //获取模块下所有的控制器和方法写入到权限表 public function initperm() { $modules = array('admin'); //模块 ...

  6. Kubernetes — 深入解析Pod对象:基本概念(一)

    在上一篇文章中,我详细介绍了 Pod 这个 Kubernetes 项目中最重要的概念. 现在,你已经非常清楚:Pod,而不是容器,才是 Kubernetes 项目中的最小编排单位.将这个设计落实到 A ...

  7. IO复用,AIO,BIO,NIO,同步,异步,阻塞和非阻塞 区别参考

    参考https://www.cnblogs.com/aspirant/p/6877350.html?utm_source=itdadao&utm_medium=referral IO复用,AI ...

  8. Thymeleaf的超链接与AJAX的跳转问题

    //th:href :超链接<a th:href="@{/list}"></a>//可以在其他页面跳转yt <form id="msform ...

  9. PhotoShop不用魔棒、钢笔 建立较平整的选区 P进电脑屏幕里

    不用魔棒.抽出.钢笔等,还可以直接变形图建立调整选区,这种方法比钢笔抽出感觉简单一些,比魔棒仔细一些. 抽出或钢笔:抽出弄错了偏移了还要擦除,调整笔刷,抽出后可能还有毛边,需要用橡皮擦除: 钢笔,错了 ...

  10. vue脚手架工具

    1.安装node.js 2.安装vue-cli npm install vue-cli -g vue -V(-V大写)查看版本信息 3.安装webpack 4.初始化项目 vue init webpa ...