一、颜色空间缩减

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. C# FileSystemWatcher 并发

    using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threa ...

  2. java高级---->Thread之ScheduledExecutorService的使用

    ScheduledExecutorService的主要作用就是可以将定时任务与线程池功能结合使用.今天我们来学习一下ScheduledExecutorService的用法.我们都太渺小了,那么容易便湮 ...

  3. 《React Native 精解与实战》书籍连载「Android 平台与 React Native 混合开发」

    此文是我的出版书籍<React Native 精解与实战>连载分享,此书由机械工业出版社出版,书中详解了 React Native 框架底层原理.React Native 组件布局.组件与 ...

  4. Django中的From和ModelForm

  5. python中socket、进程、线程、协程、池的创建方式和应用场景

    进程 场景 利用多核.高计算型的程序.启动数量有限 进程是计算机中最小的资源分配单位 进程和线程是包含关系 每个进程中都至少有一条线程 可以利用多核,数据隔离 创建 销毁 切换 时间开销都比较大 随着 ...

  6. [linux]解除linux对多次登录密码错误的账户的锁定

    其他wheel账户下,执行: sudo pam_tally2 --user=username --reset

  7. 【mysql】mysql存储引擎

    了解存储引擎我们先看下mysql的体系架构. 上图是mysql的逻辑架构图,可以看到分了几层. 第一层是大部分网路客户端工具,比如php,python  ,JDBC等,主要功能就是连接处理,授权认证等 ...

  8. A.02.01—功能定义—一般定义

    二章将属于较轻松的内容,整个过程也会主要以文字描述为主. 最常见的功能定义为按使用操作来定义,如下面的例子是最普通的: 1)用户将雨刮开关打至高速档,雨刮以高速速率刮刷 2)在电源档位为OFF时,用户 ...

  9. Vue的钩子函数[路由导航守卫、keep-alive、生命周期钩子]

    前言 说到Vue的钩子函数,可能很多人只停留在一些很简单常用的钩子(created,mounted),而且对于里面的区别,什么时候该用什么钩子,并没有仔细的去研究过,且Vue的生命周期在面试中也算是比 ...

  10. 信号(1): signal

    1. 头文件#include <signal.h> 2. 功能设置某一信号的对应动作 3. 函数原型void (*signal(int signum,void(* handler)(int ...