一、颜色空间缩减

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. 领域驱动设计系列文章(2)——浅析VO、DTO、DO、PO的概念、区别和用处

    本篇文章主要讨论一下我们经常会用到的一些对象:VO.DTO.DO和PO. 由于不同的项目和开发人员有不同的命名习惯,这里我首先对上述的概念进行一个简单描述,名字只是个标识,我们重点关注其概念: 概念: ...

  2. Django 之 admin管理工具

    -------------------------------------------------------------------------妄尝恶果,苦果自来. admin组件使用 Django ...

  3. 网站添加icon

    设置网站的icon<link rel="shortcut icon" href="./static/img/favicon.ico" >

  4. 接口请求,上传byte数组byte[]数据异常,负数变正数/负数变63

    一.背景 最近项目中有个需求,就是需要把一个byte[]数组上传到服务端.但是我发现发送的byte数组和服务端接收的数组不一样,所有的正数在传递时正确,数组长度也没变化,但是负数变成了63或者负数全部 ...

  5. Listen 指令

    L:44

  6. Drag(拖拽)和Move(移动)两个脚本

    Drag using System.Collections; using System.Collections.Generic; using UnityEngine; public class Dra ...

  7. 【LR9】【LOJ561】CommonAnts 的调和数 数论 筛法

    题目大意 有一个长度为 \(n\) 的序列. 有 \(m\) 次修改,每次给你 \(x,y\),令 \(\forall 1\leq i\leq \lfloor\frac{n}{x}\rfloor,a_ ...

  8. css 溢出overflow

    css 溢出overflow 当一个元素被设置为固定大小,在这个元素中的内容如果超出元素的界限,就会出现溢出的现象. 通常情况下我们可以通过overflow来控制这个属性. overflow语法定义 ...

  9. Window下Eclipse+Tomcat远程调试

    需求:       项目在开发环境跑得好好的,但是当发布到服务器上时,却出现了一些意外的问题.服务器上不可能给你装IDE调试工具啊,又没有很好的日志帮助下,这时候就用到了JVM的Java Platfo ...

  10. 消息框MessageBox+遍历控件

    消息对话框:主要用来显示信息,也可以警告.用户确认取消等. MessageBox.Show("展示内容","标题",MessageBoxButtons.按钮种类 ...