自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

午后斜阳

无路可走便是最好的路!

  • 博客(47)
  • 资源 (2)
  • 问答 (1)
  • 收藏
  • 关注

原创 在operator=中处理自我赋值(Effective C++_11)

一、我们平时习惯写的赋值操作代码 我们平时可能已经习惯了这样的代码,并且认为是对的:#include<iostream>using namespace std;class Demo{public: Demo& operator=(const Demo& x); Demo(int x=10,int y=15):a(x),b(y){ p=new int; }

2015-08-31 21:27:01 627 1

原创 重载赋值运算符返回reference to *this(Effective C++_10)

考虑下面的代码:int x, y, z;x = y = z = 15; 赋值工作是自右向左结合的,所以上面的赋值链可以解析成这样:x = (y = (z = 15));为了实现这种“连锁赋值”,赋值操作符必须返回一个指向操作符左边的实参的引用;当你为你的类实现赋值运算符时,你应该遵循这一惯例:class Widget {public: ...Widget& operator=(const

2015-08-31 17:12:34 488

原创 必须返回对象时,别妄想返回引用(Effective C++_21)

一、何时必须用传值一旦把注意力都转向了对象传值方式隐含的效率问题(参见第 20 条)时,对传值方法采取斩草除根的态度,在追求传递引用方式的纯粹性的同时,也犯下了致命的错误:有时候传递的引用所指向的对象并不存在。class Rational {public: Rational(int numerator = 0, int denominator = 1);// 第 24 条中解释了为什么这里的构

2015-08-31 16:11:07 360

转载 多用引用,而非传值 (Effective C++_20)

默认情况下, C++ 为函数传入和传出对象是采用传值方式的(这是由 C 语言继承而来的特征)。除非你明确使用其他方法,函数的形式参数总会通过复制实在参数的副本来创建,并且,函数的调用者得到的也是函数返回值得一个副本。这些副本是由对象的拷贝构造函数创建的。这使得“传值”成为一项代价十分昂贵的操作。请观察下边的示例中类的层次结构:class Person {public: Person();

2015-08-31 14:53:36 337

原创 离散傅立叶变换与逆变换

一、怎样为一副图像增加一个通道 Mat A=(Mat_<double>(3,3)<<1,2,3,4,5,6,7,8,9); Mat B=Mat::zeros(A.size(),A.type()); cout<<"the channels numbers of A: "<<A.channels()<<endl; Mat planels[]={A,B}; Mat

2015-08-28 09:39:44 3043

原创 链式队列

队列的另一种存储方式是链表,可以用带头结点的单链表来表示;队列的头指针front指向单链表的头结点,队列的尾指针rear指向单链表的最后一个节点。 出队就是删除第一个元素节点,入队就是在表维增加一个节点;其中链表式的队列模版中有两个数据成员,分别是队头指针front和队尾指针rear,其初始值都指向头节点,头节点后没有元素,表示空队列; 简单实现了下#ifndef NODE_h#define

2015-08-27 15:27:37 385

原创 循环队列

一、基础知识 队列(Queue)是一种限定存取位置的线性表。它只允许在表的一端插入,而在另一端删除。允许插入的一端称为队尾(rear),允许删除的一端叫做队头(front)。每次在队尾加入新元素,加入称为进队,删除称为出队。 队列的这种特性正好与栈相反,叫做先进先出(FIFO,First In First Out)。队列的存储表示也有两种方式:顺序方式和链式方式二、循环队列 队列的顺序存储方式

2015-08-27 10:44:48 912

原创 同态滤波

一、同态滤波步骤 同态滤波的基本原理是:将像元灰度值看作是照度和反射率两个组份的产物。由于照度相对变化很小,可以看作是图像的低频成份,而反射率则是高频成份。通过分别处理照度和反射率对像元灰度值的影响,达到揭示阴影区细节特征的目的。关键是选择合适的H(u,v) 二、实现clear all; close all;I=imread('pout.tif');J=log(im2double(I

2015-08-26 18:50:56 1142 3

原创 图像频域增强

一、频域增强基础 二、频域滤波步骤 三、常用的频域滤波器 (1)低通滤波器 :使低频通过而使高频衰减的滤波器,主要用于滤除高频噪声、消除由于量化不足引起的图像虚假轮廓。 (2)高通滤波器 :使高频通过而是低频衰减的滤波器,主要用于锐化图像,突出图像边界信息 (3)带通和带阻滤波器 :带阻滤波器对于图像中非调制的、带限的、加性噪声有较好的滤除效果四、低通滤波器 (1)理想低通滤波器

2015-08-26 18:35:42 1546

原创 图像滤波

一、利用自带函数实现滤波 (1) fspecial 函数 功能:产生预定义滤波器 格式:H=fspecial(type) H=fspecial(‘gaussian’,n,sigma) 高斯低通滤波器 H=fspecial(‘sobel’) Sobel 水平边缘增强滤波器

2015-08-26 15:40:57 455

原创 图像统计特性基本函数

一、图像均值 J=mean(I),I为向量,J为该均值 J=mean(A),A为一矩阵,J为每一列的均值 J=mean(A(:)),J为矩阵A的均值 J=mean2(A),J为矩阵A的均值二、图像的标准差 J=std(I),I为向量,J为该标准差 J=std(A),A为一矩阵,J为每一列的标准差 J=std(A(:)),J为矩阵A的标准差 J=std2(A);J 为矩阵A的标准差三、

2015-08-26 10:51:36 447

原创 直方图规定化

一、支付那个图规定化的原理和步骤 二、具体实现clear all;close all;clc;%% 计算给定的直方图累积分布函数r=127; x=-r:r+1;sigma=20;y1=exp(-((x-80).^2)/(2*sigma^2));y2=exp(-((x+80).^2)/(2*sigma^2));y=y1+y

2015-08-26 10:36:56 1896

原创 直方图均衡化

一、直方图均衡化原理(1) 直方图均衡化思想 直方图均衡化处理是以累积分布函数为基础的直方图修正法,即通过一个灰度映射函数,将原直方图改造成所希望的直方图。基本思想是均衡化原始图像的灰度值,对在图像中像素个数较少的灰度级进行缩减,而对图像中像素个数较多的灰度级进行扩宽,使图像对应的直方图为均匀分布的形式。增强整体的对比度。(2)均衡化的步骤 注:取整时可采用公式:k=int((L-1)*s

2015-08-25 15:57:52 5528

转载 C++异常机制

一、简单实例 异常是通过抛出对象而引发的,抛出对象的类型决定应该激活那个处理代码,即catch中的语句;被处理代码是调用链中与该抛出对象类型匹配,并且离抛出异常位置最近的那一个;例如:void test(){ throw string("eeror");}int main(){ try{ test(); }catch(string& e){

2015-08-25 15:02:46 309

原创 VC++编译链接原理与过程

简单编译链接过程 源文件先被预处理,分别编译,头文件不参与编译过程,生成目标文件,在生成可执行文件

2015-08-25 09:11:40 529

转载 static函数和变量(转载)

本文转载地址: 只供学习,不做它用,在此谢谢原文作者的辛苦总结。C++的static有两种用法:面向过程程序设计中的static和面向对象程序设计中的static。前者应用于普通变量和函数,不涉及类;后者主要说明static在类中的作用。一、面向过程设计中的static 1、静态全局变量 在全局变量前,加上关键字static,该变量就被定义成为一个静态全局变量,静态全局变量有以下特点: (1

2015-08-24 20:05:07 345

原创 operator new和 new operator的区别(More Effective C++_8(运算符))

一、分析区别首先,我们先对new和delete表达式有深入了解,先看下面的语句string *sp=new string("hello");上述代码,实际上发生了三个步骤,第一步,调用名为operator new 的标准库函数,分配足够大的原始化的未类型化的内存,来保存指定类型的一个对象;第二步,运行该类型的一个构造函数,用于初始化构造对象;最后,返回指向新分配并设定了处置的指针;上述,代码中的ne

2015-08-24 19:09:15 659

原创 改变图像的对比度和亮度

实现对比度和亮度改变的代码#include<opencv2\opencv.hpp>#include<opencv2\core\core.hpp>#include<opencv2\imgproc\imgproc.hpp>using namespace cv;int main(){ double alpha=0.6; int b=10; Mat image=imread("

2015-08-23 10:40:23 307

原创 灰度变换增强

空域内的图像增强就是调整图像的明暗对比度,对每个像素的灰度值直接处理,一般来说包括灰度变换增强和直方图增强。下面谈谈,灰度变换增强一、直方图先了解直方图,即统计每个像素出现的次数,下面的代码可以实现直方图close all;clear;clc;I=imread('images.jpg');I=rgb2gray(I);[m,n]=size(I);z=zeros(1,256);for i=1

2015-08-22 16:30:29 2427

原创 链栈实现

实现链式栈,这里用的是不带头节点的单链表,链表的表头表示栈顶,入栈与出栈都在表头进行链式栈的类模版中只有一个数据成员,即top,它为栈顶指针,指向栈顶元素,初始值为NULL,表示空栈#ifndef GUARD_NODE_h#define GUARD_NODE_h#define NULL 0template<class T>struct Node{ T data; Node<T

2015-08-21 17:24:48 322

原创 前置和后置操作符的区别(More Effective_C++_6(运算符))

++和–的原理类似,下面仅++操作符来分析前置和后置的区别先看一段代码:class A{pubilc:A& operator++();//前置++const A& operator++(int);//后置++A& operator--();//前置--const A& operator--(int);//后置--};A a;++a;//调用a.operator++()a++;//调用a.

2015-08-21 10:02:38 671

原创 警惕C++隐式转换(More Effectiv C++_5(运算符))

C++的类型转换,对于显示类型,C++定义了四种新的类型类型转换,即static_cast、dynamic_cast、const_cast、reinterpret_cast;当然C++也继承了C语言的特性,也可以用C中转换格式,即小括号; 对于隐式转换,C++允许编译器在不同类型之间执行转换,它继承了C语言的一些特性,允许默默的将char转换成int、short转换成double等等;

2015-08-20 22:07:39 555

原创 不要以多态的方式处理数组(More Effective-C++_3(基础))

类继承的最重要的特性是你可以通过基类指针或引用来操作派生类。这样的指针或引用具有行为的多态性,就好像它们同时具有多种形态。C++允许你通过基类指针和引用来操作派生类数组。不过这根本就不是一个特性,因为这样的代码几乎从不如你所愿地那样运行。 假设你有一个类BST(比如是搜索树对象)和继承自BST类的派生类BalancedBST:class BST { ... };class BalancedBS

2015-08-20 18:52:37 436

原创 图像插值方法

一、图像插值 所谓图像插值就是一个图像数据的再生过程,利用己知采样点的灰度值计未知采样点的灰度值,在给定的空间范围内,从有限的离散采样数据复原出原来连续的图像信号。1.1怎么理解图像插值 比如,图像放大算法,假设原图像是mXn大小,现在我们扩大两倍,一种简单的方法是,我们假想一个2mX2n大小的网格,它与原图像有相同大下的间隔,然后将其收缩,使其准确的跟原图像匹配

2015-08-20 16:18:06 3627

原创 matlab基础函数

一、取整函数fix, floor, ceil, round. fix朝零方向取整,floor朝负无穷方向取整,ceil即朝正无穷方向取整 round四舍五入到最近的整数;x = Columns 1 through 7 3.0000 3.1000 3.5000 3.6000 3.9000 -3.1000 -3.5000 Columns 8 through

2015-08-19 21:48:30 402

原创 高斯-塞得尔迭代法

%% 求方程组Ax=b的近似解%功能:高斯——塞德尔迭代法%输入:a方程组系数,b常数项系数,x0初始值,eps精度%输出:迭代次数和方程解%%function x=Gauss_Seidel(a,b,x0,eps)if nargin==3 eps=1.0e-6;elseif nargin<3 error; return;endd=diag(diag(a));

2015-08-19 15:01:39 3014

原创 雅各比迭代法

一、语法知识 1、严格上、下三角矩阵是指对角线上元素为零的上、下三角矩阵,可用函数tril,triu来实现A = 10 2 6 4 8 -1 -2 3 5tril(A)ans = 10 0 0 4 8 0 -2 3 5tril(A,-1)ans =

2015-08-19 14:30:53 3710

原创 Mat类基础知识

一、MAT 1、OpenCV2中,数据结构Mat是保存图像像素信息的矩阵,它主要包含两部分:矩阵头和一个指向像素数据的矩阵指针。 2、 矩阵头主要包含,矩阵尺寸、存储方法、存储地址和引用次数等,矩阵头的大小是一个常数,不会随着图像的大小而改变,但是保存图像像素数据的矩阵则会随着图像的大小而改变,通常数据量会很大,比矩阵头大几个数量级。这样,在图像复制和传递过程中,主要的开销是由存放图像像素的矩阵

2015-08-19 12:53:55 549

原创 使用C++转型操作符(More Effective_C++_2(基础))

一、c语言中的类型转换表达式:(type) expression注:几乎允许你将任何类型转换成任何其他类型,另外一个问题是它们难以辨识,因为小括号加上一个对象名,在C++任何地方都有可能被使用二、C++中新式转型操作符(cast operator)2.1 static_cast (1)表达式 static<type>(expression) (2)static_cast

2015-08-18 21:50:37 449

原创 指针和引用区别(More Effective_C++_1(基础))

区别: (1)引用不能为空,指针可以为空,引用必须需要初始值string& rs;//错误,必须初始化string s("sdf");string rs&=s//正确,指向sstring *ps;//未初始化的指针,有效,但风险高注:这个事实,意味着引用可能会比指针效率更高,因为使用引用,不必测试是否为空,而使用指针,经常需要测试其是否为空(2)指针可以被重新赋值,指向另一个对象,但是引用却总

2015-08-18 20:44:28 388

原创 实现矩阵类

#ifndef GUARD_MATRIX_H#define GUARD_MATRIX_H#include<iostream>#include<iomanip>using namespace std;template<class T=double>class matrix{ template<typename T> friend ostream& operator<<(ostre

2015-08-18 17:03:54 544

原创 顺序栈

栈(stack)又名堆栈,它是一种运算受限的线性表(栈、队列、线性表其逻辑结构均是线性的,栈和队列被称为受限的线性表)。对于栈来说,其限制是仅允许在表的一端进行插入和删除运算,这一端被称为栈顶;相对地,把另一端称为栈底;向一个栈插入新元素又称作进栈、入栈或压栈,它是把新元素放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈或退栈,它是把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素

2015-08-18 16:54:59 280

原创 canny算子及滑动条的使用

滑动条: createTrackbar(const string& trackbarname, const string& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0); 参数分别对应为:滑动条名称;显示窗口名称;当滑动条移到时,把当前位置的值传出来;滑动条最大值;回调

2015-08-18 10:36:35 614

原创 双向循环链表

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。具体代码实现部分功能:#ifndef GUARD_DBLNODE_h#define GUARD_DBLNODE_h#define NULL 0template<class T>struct

2015-08-17 19:02:31 435

原创 sobel和laplace算子

一、filter2D: 由Filter2D的名字就可以很容易判断出,这个函数是对2D图像做滤波用的函数原型: C++: void filter2D(InputArray src, OutputArraydst, int ddepth, InputArray kernel, Point anchor=Point(-1,-1), double delta=0, int borderTy

2015-08-17 15:00:54 2271 1

原创 低通滤波器

下面主要是通过调用opencv中的一些函数,来实现低通滤波:#include<opencv2\imgproc\imgproc.hpp>#include<opencv2\highgui\highgui.hpp>#include<opencv2\core\core.hpp>#include<opencv2\opencv.hpp>using namespace cv;//实现SALT噪声Mat

2015-08-17 09:46:31 640

原创 通道的拆分与合并

可以先拆分,在利用表查找改变每个通道的对比度后,再合并#include<opencv2\opencv.hpp>#include<opencv2\imgproc\imgproc.hpp>#include<opencv2\core\core.hpp>#include<vector>using namespace cv;using namespace std;int main(){ M

2015-08-14 14:26:41 457

原创 直方图均衡化

我们可以认为一副高质量的图像应该平均使用所有像素强度,直方图均衡化,即使得直方图尽可能的平坦;equalizeHist可以用来得到均衡化后的直方图,该函数返回类型是void;#include <opencv2\core\core.hpp>#include <opencv2\imgproc\imgproc.hpp>#include<opencv2\opencv.hpp>#include<iost

2015-08-14 14:24:30 275

原创 利用查找表处理图像

(1)查找表是一个一对多(或者多对一)的函数,定义了如何将像素值转换为新的值,它本质上是一个一维数组,对于常规图像而言有256个条目 (2)Opencv提供了使用查找表直接计算出量化灰度级后图像的函数——LUT (3)下面带码主要求图像的反转,以及将个数低于指定数目(默认为0)的bin舍去,剩下的最小值变为0,最大值变为255,中间的部分线性拉伸(注意写代码师一定要注意自己定义的是什么数据类型)

2015-08-14 11:06:45 902

原创 使用直方图统计像素

基础知识: (1) calcHist(),第1个参数为原数组区域列表;第二个参数为有计算几个原数组;参数3为需要统计的通道索引数;参数4为操作掩码,第5个参数为存放目标直方图矩阵;参数6为需要计算的直方图的维数;参数7为每一维的bin的个数;参数8为每一维数值的取值范围,参数10为每个bin的大小是否相同的标志,默认为1,即bin的大小都相同;参数11为直方图建立时清除内存痕迹标志,默认为0,即清

2015-08-12 21:45:23 692

Harris角点检测原理与流程

详细介绍了harris角点检测的原理和流程,并给出了原理的证明

2015-09-01

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除