程序及分析

/*
* FileName : contrast.cpp
* Author : xiahouzuoxin @163.com
* Version : v1.0
* Date : Tue 29 Jul 2014 08:09:57 PM CST
* Brief :
*
* Copyright (C) MICL,USTB
*/
#include <cv.h>
#include <highgui.h>
#include <iostream> using namespace cv;
using namespace std; int main(int argc, char *argv[])
{
float alpha = 0;
int beta = 0;
Mat image;
Mat result; if (argc<2) {
cout<<"Usage:./contrast [image_name]"<<endl;
return -1;
} image = imread(argv[1]);
if (!image.data) {
cout<<"Read image error."<<endl;
} cout<<"Enter alpha value[1-3]:"<<endl;
cin>>alpha;
cout<<"Enter beta value[0-100]:"<<endl;
cin>>beta; result.create(image.size(), image.type()); int n = image.rows * image.cols * image.channels();
uchar *p = image.data;
uchar *q = result.data;
for (int i=0; i<n; i++) {
*q++ = saturate_cast<uchar>(alpha * (*p++) + beta);
} namedWindow("origin", CV_WINDOW_AUTOSIZE);
imshow("origin", image);
namedWindow("result", CV_WINDOW_AUTOSIZE);
imshow("result", result); waitKey(0); return 0;
}
  1. 用到Mat::create成员方法用于对Mat对象的数据赋值
  2. saturate_cast在operations.hpp中定义和声明。这里的传人參数为float类型。调用的是

    template<> inline uchar saturate_cast<uchar>(float v)
    {int iv = cvRound(v); return saturate_cast<uchar>(iv);}

    当中调用重载函数saturate_cast(int)完毕。该函数的实现是:

    template<> inline uchar saturate_cast<uchar>(int v)
    {return (uchar)((unsigned)v <= UCHAR_MAX ? v : v > 0 ? UCHAR_MAX : 0)}

    由于?

    :运算符是右结合特性,saturate_cast函数的作用就是:限制数据范围为0~255。超过255的值取255,小于0的值取0

  3. 像素操作:这里没有使用ptr指针(由于操作不用考虑像素的详细x、y坐标,是单像素到单像素的映射),当然使用ptr也能够。Mat的data成员是数据头指针。程序通过指针*p与*q索引图片中的元素进行操作赋值

效果

左边为元素图像。右边为alpha=1,Beta=50时的增强亮度后的图像。

OpenCV基础篇之像素操作对照度调节的更多相关文章

  1. OpenCV基础篇之读取显示图片

    程序及分析 /* * FileName : read.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 13 May ...

  2. opencv——基础篇

    一 . opencv是什么及其作用? OpenCV是一个基于BSD许可(开源)发行的跨平台计算机视觉库,可以运行在Linux.Windows.Android和Mac OS操作系统上.它轻量级而且高效— ...

  3. opencv——图像遍历以及像素操作

    摘要 我们在图像处理时经常会用到遍历图像像素点的方式,在OpenCV中一般有四种图像遍历的方式,在这里我们通过像素变换的点操作来实现对图像亮度和对比度的调整. 补充: 图像变换可以看成 像素变换--点 ...

  4. Node基础篇(文件操作)

    文件操作 相关模块 Node内核提供了很多与文件操作相关的模块,每个模块都提供了一些最基本的操作API,在NPM中也有社区提供的功能包 fs: 基础的文件操作 API path: 提供和路径相关的操作 ...

  5. OpenCV基础篇之查找表

    程序及分析 /* * FileName : lookup_table.cpp * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Su ...

  6. Python学习—基础篇之文件操作

    文件操作 文件操作也是编程中需要熟练掌握的技能,尤其是在后台接口编写和数据分析过程中,对各种类型的文件进行操作,获取文件信息或者对信息进行存储是十分重要的.本篇博客中将主要对常见的文本格式文件和Exc ...

  7. OpenCV图像处理篇之阈值操作函数

    阈值操作类型 这5种阈值操作类型保留opencv tutorials中的英文名称.依次为: Threshold Binary:即二值化,将大于阈值的灰度值设为最大灰度值.小于阈值的值设为0. Thre ...

  8. OpenCV基础篇之画图及RNG随机数对象

    程序及分析 /* * FileName : random_gen.c * Author : xiahouzuoxin @163.com * Version : v1.0 * Date : Tue 29 ...

  9. 自动化测试基础篇--Selenium cookie操作

    摘自https://www.cnblogs.com/sanzangTst/p/8376471.html 在验证浏览器中cookie是否正确时,有时基于真实cookie的测试是无法通过白盒和集成测试进行 ...

随机推荐

  1. MySQL的主从复制(windows)

    在我们实际的开发中,当系统业务到达一定的程度,可能数据库会到达一定的瓶颈,但实际开发中最容易到达数据库瓶颈的应该是数据库的读性能,一般的业务大多都是读多写少,我们可以通过提高读的性能来提高数据库的整体 ...

  2. PAT甲级考前整理(2019年3月备考)之二,持续更新中.....

    PAT甲级考前整理之一网址:https://www.cnblogs.com/jlyg/p/7525244.html,主要总结了前面131题的类型以及易错题及坑点. PAT甲级考前整理三网址:https ...

  3. UVM基础之-------uvm report机制的使用

    后面的例子我会继续补充: 1. 因为uvm默认定义的message格式比较长,非常不利于debug过程中的分析使用,一般情况下,开始使用uvm,都要利用uvm_report_server重新定义mes ...

  4. Spring框架系列(二)--装配和注入Bean

    企业日常开发中,几乎都是Spring系的框架,无论是SSM.还是现在大火的SpringBoot+JPA/MyBatis,使用最大的目的就是简化开发 基本模块: 核心容器:Beans.Core.Cont ...

  5. ThinkPHP---TP功能类之公文管理功能2----------继续完善

    [前言] 之前已经完成了公文的添加和列表展示功能,今天继续完善.做下公文的编辑和删除功能. [主体] (1)分析 控制器:DocController.class.php 方法:edit(将模板展示和数 ...

  6. 05Oracle Database 表空间查看,创建,修改及删除

    Oracle Database 表空间查看,创建,修改及删除 查看用户表空间 查看数据库管理员表空间表结构 desc dba_tablespaces; 查询表空间名称从管理员表空间表中 select ...

  7. HDU多校Round 5

    Solved:3 rank:71 E. Everything Has Changed #include <bits/stdc++.h> using namespace std; const ...

  8. RC: blkio throttle 测试

    本文将测试一下使用cgroup的blkio组来控制IO吞吐量 : 测试环境CentOS 7.x x64 创建一个继承组 [root@150 rg1]# cd /sys/fs/cgroup/blkio/ ...

  9. Extjs获得组件值的方式

     Extjs中找Form,Extjs找组件的方式: 1,Extjs.getCmp 2,通过组件之间的关系,up,down 结论: 1,form.getValues()和form.getForm().g ...

  10. Luogu P1311 选择客栈

    暴力 我一开始做这道题先想到的就是暴力... 所以先说一下暴力的做法.首先在输入的时候讲花费小于P的位置标记下来,然后用两层循环枚举所有的两个客栈的组合方案.再用一层循环将两个客栈之间的位置扫一遍,如 ...