一、颜色空间缩减

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. 全国天气预报信息数据 API 功能简介与代码调用实战视频

    此文章对开放数据接口 API 之「全国天气预报信息数据 API」进行了功能介绍.使用场景介绍以及调用方法的说明,供用户在使用数据接口时参考之用,并对实战开发进行了视频演示. 1. 产品功能 接口开放了 ...

  2. ubuntu 18.04安装pytorch、cuda、cudnn等

    版权声明:本文为博主原创文章,欢迎转载,并请注明出处.联系方式:460356155@qq.com ubuntu 16.04用了1年多了,18.04版已经发布也半年了,与时俱进,重装Linux系统,这里 ...

  3. RPC框架原理简述:从实现一个简易RPCFramework说起(转)

    摘要: 本文阐述了RPC框架与远程调用的产生背景,介绍了RPC的基本概念和使用背景,之后手动实现了简易的RPC框架并佐以实例进行演示,以便让各位看官对RPC有一个感性.清晰和完整的认识,最后讨论了RP ...

  4. SpringCloud学习笔记:负载均衡Ribbon(3)

    1. RestTemplate简介 RestTemplate是Spring Resource中一个访问第三方RESTful API接口的网络请求框架. RestTemplate是用来消费REST服务的 ...

  5. Servlet的 GenericServlet 和 HttpServlet

    一.GenericServlet? servlet 是一个接口 下面有两个抽象类 GenericServlet 和 HttpServlet 需要被 继承并重写其中的方法. package javawe ...

  6. Linux 学习 (六) 关机与重启命令

    Linux达人养成计划 I 学习笔记 shutdown [选项] 时间 -c:取消前一个关机命令 -h:关机 -r:重启 shutdown命令会在关机或重启时自动保存系统中正在运行的服务,最安全的关机 ...

  7. [SimplePlayer] 6. 音频同步

    音频的同步并不需要我们在程序实现.在设置好声道.采样率.音频格式后,程序只需要保证能一直提供音频数据就行,其余工作基本都由声卡实现.

  8. C++/cli中swtich处理命令行接收到的关键字

    QQ群友中有人提出这样一个问题: Swtich接受的是整形或枚举类型, 关键字多数是一个字符, 将string转换成char就应该可以, 所以我试着写了一下代码, 直接提取string的第一个字符, ...

  9. cas单点登录-https的配置(一)

     前言   由于个人的兴趣和为了加薪,在这里研究下cas单点登录,同时也记录下自己探索的过程,希望也能帮到有同样兴趣的小伙伴 环境 CAS-5.1.3 tomcat8.5 jdk8 centos6.5 ...

  10. POJ3565 Ants (不相交线)

    那请告诉我 A - D  B - C  和  A - C  B - D 那个的和小 显然是A - C  B - D  (可以根据四边形 对角线大于对边之和) 然后 求的答案是不是就一定是不相交的 就是 ...