精华内容
下载资源
问答
  • 帧同步,帧同步是什么意思

    千次阅读 2019-04-08 12:57:45
    帧同步,帧同步是什么意思 在数字通信时,一般总是以一定数目的码元组成一个个的“字”或“句”,即组成一个个的“群”进行传输的。因此,群同步信号的频率很容易由位同步信号经分频而得出。但是,每个群的开头和末尾...

    帧同步,帧同步是什么意思
    在数字通信时,一般总是以一定数目的码元组成一个个的“字”或“句”,即组成一个个的“群”进行传输的。因此,群同步信号的频率很容易由位同步信号经分频而得出。但是,每个群的开头和末尾时刻却无法由分频器的输出决定。群同步的任务就是在位同步信息的基础上,识别出数字信息群(“字”或“句”)的起止时刻,或者说给出每个群的“开头”和“末尾”时刻。
    群同步有时也称为帧同步。为了实现群同步,可以在数字信息流中插入一些特殊码字作为每个群的头尾标记,这些特殊的码字应该在信息码元序列中不会出现,或者是偶然可能出现,但不会重复出现,此时只要将这个特殊码字连发几次,收端就能识别出来,接收端根据这些特殊码字的位置就可以实现群同步。本节将主要讲述插入特殊码字实现群同步的方法。
    插入特殊码字实现群同步的方法有两种,即连贯式插入法和间隔式插入法。在介绍这两种方法以前,先简单介绍一种在电传机中广泛使用的起止式群同步法。
    起止同步法
    目前在电传机中广泛使用的同步方法,就是起止式群同步法,下面就以电传机为例,简要地介绍一下这种群同步方法的工作原理。
    电传报文的一个字由7.5个码元组成,假设电传报文传送的数字序列为10010,则其码元结构如图1所示。从图中可以看到,在每个字开头,先发一个码元的起脉冲(负值),中间5个码元是信息,字的末尾是1.5码元宽度的止脉冲(正值),收端根据正电平第一次转到负电平这一特殊规律,确定一个字的起始位置,因而就实现了群同步。由于这种同步方式中的止脉冲宽度与码元宽度不一致,就会给同步数字传输带来不便。另外,在这种同步方式中,7.5个码元中只有5个码元用于传递信息,因此编码效率较低。但起止同步的优点是结构简单,易于实现,它特别适合于异步低速数字传输方式。

    连贯式插入法
    连贯式插入法就是在每群的开头集中插入群同步码字的同步方法。作群同步码字用的特殊码字首先应该具有尖锐单峰特性的局部自相关特性,其次这个特殊码字在信息码元序列中不易出现以便识别,最后群同步识别器需要尽量简单。目前已经找到的最常用的群同步码字,就是“巴克”码。
    1.巴克码
    巴克码是一种具有特殊规律的二进制码字。它的特殊规律是:若一个n位的巴克码{X1,X2,X3,…Xn},每个码元 只可能取值+1或-1,则它必然满足条件
    式(1)中,R(j)称为局部自相关函数。从巴克码计算的局部自相关函数可以看到,它满足作为群同步码字的第一条特性,也就是说巴克码的局部自相关函数具有尖锐单峰特性,从后面的分析同样可以看出,它的识别器结构非常简单。目前人们已找到了多个巴克码字,具体情况如表1所示。表中+表示+1,–表示–1。
    以n = 7的巴克码为例,它的局部自相关函数计算结果如下

    同样可以求出j = 3、4、5、6、7,以及j = -1、-2、-3、-4、-5、-6、-7时R(j)的值为

    根据式(2)计算出来的这些值,可以作出7位巴克码关于R(j)与j的关系曲线,如图2。由图2可以看出,自相关函数在j=0时具有尖锐的单峰特性。局部自相关函数具有尖锐的单峰特性正是连贯式插入群同步码字的主要要求之一。

    2.巴克码识别器
    巴克码识别器是比较容易实现的,这里以七位巴克码为例,用7级移位寄存器、相加器和判决器就可以组成一识别器,具体结构如图7-16所示。7级移位寄存器的1、0端输出按照1110010的顺序连接到相加器输入,接法与巴克码的规律一致。当输入数据的“1”存入移位寄存器时,“1”端的输出电平为+1,而“0”端的输出电平为-1;反之,存入数据“0”时,“0”端的输出电平为+1,“1”端的电平为-1。
    当发送端送来的码元自右向左进入时,首先考虑一个简单的情况:假设只计算巴克码(1110010)进入的几个移位寄存器的输出,此时将有巴克码进入一位,二位……七位全部进入,第一位移出尚留六位……前六位移出只留一位等13种情况。经过计算可得相加器的输出就是自相关函数,设码元进入移位寄存器数目为a,码元尚留在移位寄存器的数目是b,这是就可以得到a、b和j之间的关系式

    根据上述关系可以得到表2,它反映了相加器输出与a、b之间的关系。

    实际上述群同步码的前后都是有信息码的,具体情况如图4(a)所示,在这种情况下巴克码识别器的输出波形如图4(b)所示。

    当七位巴克码在图4中的t1时刻,正好已全部进入了7级移位寄存器,这时7个移位寄存器输出端都输出+1,相加后得最大输出+7,如图4(b)所示,而判决器输出的两个脉冲之间的数据,称为一群数据或称为一帧数据。
    当然,对于信息而言,由于其具有的随机特性,可以考察一种最不利的情况:即当巴克码只有部分码在移位寄存器时,信息码占有的其它移位寄存器的输出全部是+1,在这样一种对于群同步最不利的情况下,相加器的输出将如表3所示。由此可得到相加器的输出波形如图5所示。图中横坐标用a表示,由a、b和j之间的关系可知,a=14-b。

    由图5可以看出,如果判决电平选择为6,就可以根据a=7时相加器输出的7,大于判决电平6而判定巴克码全部进入移位寄存器的位置。此时识别器输出一个群同步脉冲,表示群的开头。一般情况下,信息码不会正好都使移位寄存器的输出均为+1,因此实际上更容易判定巴克码全部进入移位寄存器的位置。后面还要讲到如果巴克码中有误码时,只要错一个码,当a=7时相加器输出将由7变为5,低于判决器的判决电平。因此,为了提高群同步的抗干扰性能,防止漏同步,判决电平可以改为4。但改为4以后容易发生假同步,这些问题在性能分析时要进一步讨论。
    间歇式插入法
    在某些情况下,群同步码字不再是集中插入在信息码流中,而是将它分散地插入,即每隔一定数量的信息码元,插入一个群同步码字。这种群同步码字的插入方式被称为间歇式插入法。
    当然集中式插入法和间歇式插入法在实际系统当中都有应用,例如在32路数字电话PCM系统中,实际上只有30路通电话,另外两路中的一路专门作为群同步码传输,而另一路作为其它标志信号用,这就是连贯式插入法的一个应用实例。而在24路PCM系统中,群同步则采用间歇式插入法。在这个系统中,一个抽样值用8位码表示,此时24路电话都抽样一次共有24个抽样值,192(24×8=192)个信息码元。192个信息码元作为一帧,在这一帧插入一个群同步码元,这样一帧共193个码元。24路PCM系统如图7-19所示:
    由于间歇式插入法,是将群同步码元分散的插入倒信息流中,因此,群同步码码型选择有一定的要求,其主要原则是:首先要便于收端识别,即要求群同步码具有特定的规律性,这种码型可以是全“1”码、“1”“0”交替码等;其次,要使群同步码的码型尽量和信息码相区别。例如在某些PCM多路数字电话系统中,用全“0”码代表“振铃”,用全“1”码代表“不振铃”,这时,为了使群同步码字与振铃相区别,群同步码就不能使用全“1”或全“0”。
    收端要确定群同步码的位置,就必须对接收的码进行搜索检测。一种常用检测方法为逐码移位法,它是一种串行的检测方法;另一种方法是RAM帧码检测法,它是利用RAM构成帧码提取电路的一种并行检测方法。这里将介绍逐码移位法的基本原理和实现同步的过程。

    逐码移位法的基本原理就是,由位同步脉冲(位同步码)经过n次分频以后的本地群码(频率是正确的,但相位不确定)与接收到码元中间歇式插入的群同步码进行远码移位比较,使本地群码与发送来的群同步码同步。其原理结构框图如图7:

    图7中异或门、延迟一位电路和禁门是专门用来扣除位同步码元以调整本地群码相位的,具体过程可以通过图8看到。
    设接收信码(波形c)中的群同步码位于画斜线码元的位置,后面依次安排各路信息码1、2、3(为简单起见,只包含三路信息码)。如果系统已经实现了群同步,则位同步码(波形a)经四次分频后,就可以使得本地群码的相位与收信码中的群同步码的相位一致。现在假设开始时如波形d图所示,本地群码的位置与波形c收信码中的群码位置相差两个码元位。为了易于看出逐码移位法的工作过程,假设群码为全“1”码,其余的信息码均与群码不同,为“0”。在第一码元时间,波形c与d不一致,原理图中的异或门有输出(波形e),经延迟一码元后,得波形f加于禁门,扣掉位同步码的第2个码元(波形b的第2个码元位置用加一叉号表示),这样分频器的状态在第2码元期间没有变化,因而分频器本地群码的输出仍保持和第1码元时相同。这时,它的位置只与收信码中的群码位置相差一位了(见波形d1)。

    类似地在第2码元时间,c又和d1进行比较,产生码形e1和f1,又在第3码元位置上扣掉一个位同步码,使本地群码的位置又往后移一位(波形d2)。至此以后,收信码中的群码与本地群码的位置就完全一致了,因而就实现了群同步。同时,也就提供了各路的定时信号。
    从图8表示的群同步建立原理来看,如果信息码中所有的码都与群码不同,那么最多只要连续经过N次调整,经过NTb的时间就可以建立同步了。但实际上信息码中“l”、“0”码均会出现,当出现“1”码时,在上面群同步过程的例子中,第1个位同步码对应的时间内信息码为“1”,图7-21中异或门输出 e=0,f=0禁门不起作用,不扣除第2位同步码,因此本地群码不会向右移展宽,这一帧调整不起作用,一直要到下一帧才有可能调整。假如下一帧本地群码d还是与信码中“1”码相对应,则调整又不起作用。当信息码中1、0码等概出现时,即P(1)=P(0)=0.5时,经过计算,群同步平均建立的时间近似为 (5)
    群同步系统的性能指标
    对于群同步系统而言,希望其建立的时间要短、建立同步以后应该具有较强的抗干扰能力。因此,在通常情况下,用以下三个性能指标来表示群同步性能的好坏,它们是:(1)漏同步概率P1;(2)假同步概率P2;(3)群同步平均建立时间ts。
    不同形式的同步系统,性能自然也不同。在此将主要分析集中插入方式的群同步系统的性能。
    1.漏同步概率P1
    由于噪声和干扰的影响,会引起群同步码字中一些码元发生错误,从而使识别器漏识别已发出的群同步码字,出现这种情况的概率称为漏识概率,用符号 来表示。以7位巴克码识别器为例,设判决门限为6,此时7位巴克码中只要有一位码发生错误,当7位巴克码全部进入识别器时,相加器输出就由7变5,小于判决门限6,这时就出现了漏同步情况,因此,只有一位码也不错才不会发生漏同步。若在这种情况下,将判决门限电平降为4,识别器就不会漏识别,这时判决器容许7位同步码字中有一个错误码元。
    在信息码中也可能出现与所要识别的群同步码字相同的码字,这时识别器会把它误认为群同步码字而出现假同步。出现这种情况的概率就被称为假同步概率,用符号P2表示。
    因此,计算假同步概率P2计算信息码元中能被判为同步码字的组合数与所有可能的码字数之比。设二进制信息码中1和0码等概出现,也就是P(1)=P(0)=0.5,则由该二进制码元组成n位码字的所有可能的码字数为2n个,而其中能被判为同步码字的组合数也与m有关,这里m表示判决器容许群同步码字中最大错码数,若m=0时,只有 个码字能识别;若M=1,则有 个码字能识别。以此类推,就可求出信息码元中可以被判为同步码字的组合数,这个数可以表示为 ,由此可得假同步概率的表达式为

    从式(6)和式(7)可以看到,随着m的增大,也就是随着判决门限电平降低,P1减小,但P2将增大,所以这两项指标是相互矛盾的。所以,判决门限的选取要兼顾漏同步概率和假同步概率。
    3.群同步平均建立时间ts
    对于连贯式插入的群同步而言,设漏同步和假同步都不发生,也就是P1 = 0和P2 = 0。在最不利的情况下,实现群同步最多需要一群的时间。设每群的码元数为N(其中m位为群同步码),每码元时间为Tb,则一群码的时间为NTb。考虑到出现一次漏同步或一次假同步大致要多花费 的时间才能建立起群同步,故群同步的平均建立时间大致为:

    群同步的保护
    1.连贯式插入法中的群同步保护
    连贯式插入法中的群同步保护电路如图9。在群同步尚末建立时,系统处于捕捉态,状态触发器C的Q端为低电平,群同步码字识别器的判决门限电平较高,因而就减小了假同步概率P2。这时在保护电路中,由于把判决门限电平调高,假同步的概率已很小,故保护电路中的n分频器被置零,禁止位同步n分频后输出。这里的n表示一帧数据的长度,因此,在置零信号无效时,位同步n分频后可以输出一个与群同步同频的信号,但脉冲位置不能保证与群同步脉冲位置相同,而这个脉冲位置也正是需要捕捉态确定的。

    从图9可以看到,为了减小假同步的概率,必须连续 次接收的码元与本地群码相一致,才被认为是建立了同步,采用这种方法可使假同步的概率大大减小。
    状态触发器C在同步末建立时处于“捕捉态”(此时Q端为低电平)。本地群码和收码只有连续n1次一致时,n1计数电路才输出一个脉冲使状态触发器的Q端由低电平变为高电平,群同步系统就由捕捉态转为维持态,表示同步已经建立。这样收码就可通过与门1加至解调器。偶然的一致是不会使状态触发器改变状态的,因为 次中只要有一次不一致,就会使计数电路置“0”。
    同步建立以后,可以利用状态触发器C和n2计数电路,来防止漏同步以提高同步系统的抗干扰能力。一旦转为维持状态以后,触发器C的Q反端变为低电乎,将与门2封闭。这时即使由于某些干扰使e有输出,也不会调整本地群码的相位。如果是真正的失步,e就会不断地将输出加到n2计数电路,同时e的反也不断将 计数电路置“0”。这时n1计数电路也不会再有输出加到n2计数电路的置“0”端上,而当n2计数电路输入脉冲的累计数达到n2时,就输出一个脉冲使状态触发器由维持态转为捕捉态,C触发器的Q反端转为高电平。这样,一方面与门2打开,群同步系统又重新进行逐码移位,另一方面封闭与门1,使解调器暂停工作。由此可以看出,将逐码移位法群同步系统划分为捕捉态和维持态后,既提高了同步系统的可靠性,又增加了系统的抗干扰能力。

    展开全文
  • 零、前言: 本文的知识点一览 ...3.本文会实现两个自定义控件:FitImageView(图片自适应)和BiggerView(放大镜),前者为后者作为铺垫。 4.最后会介绍如何从guihub生成自己的依赖库,这样一个完整的自定义...

    零、前言:

    本文的知识点一览

    1.自定义控件及自定义属性的写法,你也将对onMesure有更深的认识
    2.关于bitmap的简单处理,及canvas区域裁剪
    3.本文会实现两个自定义控件:FitImageView(图片自适应)BiggerView(放大镜),前者为后者作为铺垫。
    4.最后会介绍如何从guihub生成自己的依赖库,这样一个完整的自定义控件库便ok了。
    5.本项目源码见文尾捷文规范第一条

    实现效果一览:

    1.放大镜效果1:

    9414344-748958617232b4f3.gif
    放大镜效果1.gif

    2.放大镜效果2:(使用了clipOutPath需要API26)

    9414344-ff733f2bd5499cbb.gif
    放大镜效果2.gif
    3.该控件已做成类库(欢迎star),使用:
        allprojects {
            repositories {
                ...
                maven { url 'https://jitpack.io' }
            }
        }
        
        dependencies {
                implementation 'com.github.toly1994328:BiggerView:v1.01'
        }
    

    一、宽高等比例自适应的控件:FitImageView

    一开始想做放大镜效果,没多想就继承ImageView了,后来越做越困难,bitmap的裁剪模式会影响视图中显示图片的大小。
    而View自己的的大小不变,会导致图片显示宽高捕捉困难,和图片左上角捕捉困难。
    这就会导致绘制放大图片时的定位适配困难,那么多裁剪模式,想想都崩溃。
    于是我想到,自己定义图像显示的view算了,需求是宽高按比例适应,并且View的尺寸即图片的尺寸,
    将蓝色作为背景,结果如下,你应该明白是什么意思了吧,就是既想要图片不变形,又想不要超出的背景区域:

    9414344-5308d12f6f1bf129.png
    宽大于高.png
    9414344-ad744b38415eb67e.png
    高大于宽.png

    1.自定义属性:
        <!--图片放大镜-->
        <declare-styleable name="FitImageView">
            <!--图片资源-->
            <attr name="z_fit_src" format="reference"/>
        </declare-styleable>
    
    2.自定义控件初始代码
    /**
     * 作者:张风捷特烈<br/>
     * 时间:2018/11/19 0019:0:14<br/>
     * 邮箱:1981462002@qq.com<br/>
     * 说明:宽高自适应图片视图
     */
    public class FitImageView extends View {
    
        private Paint mPaint;//主画笔
        private Drawable mFitSrc;//自定义属性获取的Drawable
        private Bitmap mBitmapSrc;//源图片
        protected Bitmap mFitBitmap;//适应宽高的缩放图片
    
        protected float scaleRateW2fit = 1;//宽度缩放适应比率
        protected float scaleRateH2fit = 1;//高度缩放适应比率
        protected int mImageW, mImageH;//图片显示的宽高
    
        public FitImageView(Context context) {
            this(context, null);
        }
    
        public FitImageView(Context context, @Nullable AttributeSet attrs) {
            this(context, attrs,0);
        }
    
        public FitImageView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.FitImageView);
            mFitSrc = a.getDrawable(R.styleable.FitImageView_z_fit_src);
            a.recycle();
            init();//初始化
        }
    
        private void init() {
            //初始化主画笔
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mBitmapSrc = ((BitmapDrawable) mFitSrc).getBitmap();//获取图片
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            //TODO draw
        }
    
    3.测量及摆放:(这是核心处理)
    @Override
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
        super.onMeasure(widthMeasureSpec, heightMeasureSpec);
        mImageW = dealWidth(widthMeasureSpec);//显示图片宽
        mImageH = dealHeight(heightMeasureSpec);//显示图片高
        float bitmapWHRate = mBitmapSrc.getHeight() * 1.f / mBitmapSrc.getWidth();//图片宽高比
        if (mImageH >= mImageW) {
            mImageH = (int) (mImageW * bitmapWHRate);//宽小,以宽为基准
        } else {
           mImageW = (int) (mImageH / bitmapWHRate);//高小,以高为基准
        }
        setMeasuredDimension(mImageW, mImageH);
    }
    
    
    /**
     * @param heightMeasureSpec
     * @return
     */
    private int dealHeight(int heightMeasureSpec) {
        int result = 0;
        int mode = MeasureSpec.getMode(heightMeasureSpec);
        int size = MeasureSpec.getSize(heightMeasureSpec);
        if (mode == MeasureSpec.EXACTLY) {
            //控件尺寸已经确定:如:
            // android:layout_height="40dp"或"match_parent"
            scaleRateH2fit = size * 1.f / mBitmapSrc.getHeight() * 1.f;
            result = size;
        } else {
            result = mBitmapSrc.getHeight();
            if (mode == MeasureSpec.AT_MOST) {//最多不超过
                result = Math.min(result, size);
    
            }
        }
        return result;
    }
    
    
    /**
     * @param widthMeasureSpec
     */
    private int dealWidth(int widthMeasureSpec) {
        int result = 0;
        int mode = MeasureSpec.getMode(widthMeasureSpec);
        int size = MeasureSpec.getSize(widthMeasureSpec);
        if (mode == MeasureSpec.EXACTLY) {
            //控件尺寸已经确定:如:
            // android:layout_XXX="40dp"或"match_parent"
            scaleRateW2fit = size * 1.f / mBitmapSrc.getWidth();
            result = size;
    
        } else {
            result = mBitmapSrc.getWidth();
            if (mode == MeasureSpec.AT_MOST) {//最多不超过
                result = Math.min(result, size);
            }
        }
        return result;
    }
    
    4.创建缩放后的bitmap及绘制

    创建的时机选择在onLayout里,因为要先测量后才能知道缩放比

    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        mFitBitmap = createBigBitmap(Math.min(scaleRateW2fit, scaleRateH2fit), mBitmapSrc);
        mBitmapSrc = null;//原图已无用将原图置空
    }
    
    /**
     * 创建一个rate倍的图片
     *
     * @param rate 缩放比率
     * @param src  图片源
     * @return 缩放后的图片
     */
    protected Bitmap createBigBitmap(float rate, Bitmap src) {
        Matrix matrix = new Matrix();
        //设置变换矩阵:扩大3倍
        matrix.setValues(new float[]{
                rate, 0, 0,
                0, rate, 0,
                0, 0, 1
        });
        return Bitmap.createBitmap(src, 0, 0,
                src.getWidth(), src.getHeight(), matrix, true);
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        canvas.drawBitmap(mFitBitmap, 0, 0, mPaint);
    }
    

    一、自定义控件:BiggerView

    1.自定义属性:attrs.xml
    <?xml version="1.0" encoding="utf-8"?>
    <resources>
        <!--图片放大镜-->
        <declare-styleable name="BiggerView">
            <!--半径-->
            <attr name="z_bv_radius" format="dimension"/>
            <!--边线宽-->
            <attr name="z_bv_outline_width" format="dimension"/>
            <!--进度色-->
            <attr name="z_bv_outline_color" format="color"/>
            <!--放大倍率-->
            <attr name="z_bv_rate" format="float"/>
        </declare-styleable>
    </resources>
    
    2.初始化自定义控件
    public class BiggerView extends FitImageView {
        private int mBvRadius = dp(30);//半径
        private int mBvOutlineWidth = 2;//边线宽
    
        private float rate = 4;//默认放大的倍数
        private int mBvOutlineColor = 0xffCCDCE4;//边线颜色
    
        private Paint mPaint;//主画笔
        private Bitmap mBiggerBitmap;//放大的图片
        private Path mPath;//剪切路径
    
        public BiggerView(Context context) {
            this(context, null);
        }
    
        public BiggerView(Context context, AttributeSet attrs) {
            this(context, attrs, 0);
        }
    
        public BiggerView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            TypedArray a = context.obtainStyledAttributes(attrs, R.styleable.BiggerView);
            mBvRadius = (int) a.getDimension(R.styleable.BiggerView_z_bv_radius, mBvRadius);
            mBvOutlineWidth = (int) a.getDimension(R.styleable.BiggerView_z_bv_outline_width, mBvOutlineWidth);
            mBvOutlineColor = a.getColor(R.styleable.BiggerView_z_bv_outline_color, mBvOutlineColor);
            rate = (int) a.getFloat(R.styleable.BiggerView_z_bv_rate, rate);
            a.recycle();
            init();
        }
    
        private void init() {
            //初始化主画笔
            mPaint = new Paint(Paint.ANTI_ALIAS_FLAG);
            mPaint.setStyle(Paint.Style.STROKE);
            mPaint.setColor(mBvOutlineColor);
            mPaint.setStrokeWidth(mBvOutlineWidth * 2);
            mPath = new Path();
        }
    
        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            }
        }
    }
    

    二、初级阶段

    点击的时候生成一个圆球,并随着手指移动跟随移动,松开手时消失,如图:
    这个小球就是将来展示局部放大效果的地方

    9414344-a7ab3d9439b9ea86.gif
    初阶效果.gif
    1.添加成员变量:
    private int mBvRadius = dp(30);//半径
    private Paint mPaint;//主画笔
    
    private float mCurX;//当前触点X
    private float mCurY;//当前触点Y
    private boolean isDown;//是否触摸
    
    2.触点的处理
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                isDown = true;
                mCurX = event.getX();
                mCurY = event.getY();
                break;
            case MotionEvent.ACTION_UP:
                isDown = false;
        }
        invalidate();//记得刷新
        return true;
    }
    
    3.绘制
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (isDown) {
            canvas.drawCircle(mCurX, mCurY, mBvRadius, mPaint);
        }
    }
    

    三、中级阶段:(放大图片的处理)

    9414344-748958617232b4f3.gif
    放大镜效果1.gif
    9414344-4b3f87e536599a38.png
    放大图平移到触点.png
    1.在onLayout时创建一个rate倍大小的Bitmap
    @Override
    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
        super.onLayout(changed, left, top, right, bottom);
        mBiggerBitmap = createBigBitmap(rate, mFitBitmap);
    }
    
    2.绘制比放大后的图

    这里通过定位,将图片移至指定位置

        @Override
        protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            if (isDown) {
                canvas.drawBitmap(mBiggerBitmap, -mCurX * (rate - 1), -mCurY * (rate - 1), mPaint);
            }
        }
    

    这样效果1就完成了


    3.效果2的实现:

    使用了clipOutPath的API,不须26及以上
    一开始触点是在圆的中心,这里往上调了一下(理由很简单,手指太大,把要看的部位遮住了...)
    但这有个问题,就是最上面的部分再往上就无法显示了,使用做了如下的优化:

    9414344-0e7e2dba8422056e.gif
    优化.gif
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        mShowY = -mCurY * (rate - 1) - 2 * mBvRadius;
        canvas.drawBitmap(mBiggerBitmap,
                -mCurX * (rate - 1), mShowY, mPaint);
        float rY = mCurY > 2 * mBvRadius ? mCurY - 2 * mBvRadius : mCurY +  mBvRadius;
        mPath.addCircle(mCurX, rY, mBvRadius, Path.Direction.CCW);
        canvas.clipOutPath(mPath);
        super.onDraw(canvas);
        canvas.drawCircle(mCurX, rY, mBvRadius, mPaint);
    }
    

    四、高级阶段:优化点:

    1.使用枚举切换放大镜类型:
    enum Style {
        NO_CLIP,//无裁剪,直接放大
        CLIP_CIRCLE,//圆形裁剪
    }
    
    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        if (isDown) {
            switch (mStyle) {
                case NO_CLIP://无裁剪,直接放大
                    float showY = -mCurY * (rate - 1);
                    canvas.drawBitmap(mBiggerBitmap, -mCurX * (rate - 1), showY, mPaint);
                    break;
                case CLIP_CIRCLE:
                    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                        mPath.reset();
                        showY = -mCurY * (rate - 1) - 2 * mBvRadius;
                        canvas.drawBitmap(mBiggerBitmap, -mCurX * (rate - 1), showY, mPaint);
                        float rY = mCurY > 2 * mBvRadius ? mCurY - 2 * mBvRadius : mCurY + mBvRadius;
                        mPath.addCircle(mCurX, rY, mBvRadius, Path.Direction.CCW);
                        canvas.clipOutPath(mPath);
                        super.onDraw(canvas);
                        canvas.drawCircle(mCurX, rY, mBvRadius, mPaint);
                    } else {
                        mStyle = Style.NO_CLIP;//如果版本过低,无裁剪,直接放大
                        invalidate();
                    }
                    //可拓展更多模式....
            }
        }
    }
    
    2.落点在图片边界区域处理:
    9414344-b5d1c7cb2729689a.png
    矩形区域校验.png
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN:
            case MotionEvent.ACTION_MOVE:
                mCurX = event.getX();
                mCurY = event.getY();
                //校验矩形区域
                isDown = judgeRectArea(mImageW / 2, mImageH / 2, mCurX, mCurY, mImageW, mImageH);
                break;
            case MotionEvent.ACTION_UP:
                isDown = false;
        }
        invalidate();//记得刷新
        return true;
    }
    
    /**
     * 判断落点是否在矩形区域
     */
    public static boolean judgeRectArea(float srcX, float srcY, float dstX, float dstY, float w, float h) {
        return Math.abs(dstX - srcX) < w / 2 && Math.abs(dstY - srcY) < h / 2;
    }
    

    五、上传github并成库

    0.变成库!!,变成库!!,变成库!!
    9414344-58cb802128a63935.png
    变成库.png

    1.上传github
    9414344-0b1c6f12ee035dcb.png
    上传github.png

    2.发布:
    9414344-e54abdaaacdfcddd.png
    1.png
    9414344-d058c5cfcd40a767.png
    2.png

    3.查看:https://jitpack.io/
    9414344-e8b282419b05d06d.png
    see1.png
    4.测试使用:
    9414344-aaff6c5794ddbce4.png
    使用.png

    ok,本篇完结


    后记:捷文规范

    1.本文成长记录及勘误表
    项目源码日期备注
    V0.1--github2018-11-17Android自定义控件之局部图片放大镜--BiggerView
    2.更多关于我
    笔名QQ微信爱好
    张风捷特烈1981462002zdl1994328语言
    我的github我的简书我的掘金个人网站
    3.声明

    1----本文由张风捷特烈原创,转载请注明
    2----欢迎广大编程爱好者共同交流
    3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
    4----看到这里,我在此感谢你的喜欢与支持


    9414344-8a0c95a090041a0d.png
    icon_wx_200.png
    展开全文
  • 在“通道”里面,选择红色后,图层中的白色越多,则表示图片的红色所占比例越大,黑色越多代表着红色越少,绿色,蓝色也是代表着这个意思。 所以在调色上,我们可以遵循三原色的原理来进行调色,具体的使用色卡方法...

    色彩图片在RGB中都是三原色构成的。
    R代表着红色,是红色(red)的缩写
    G代表着绿色,是绿色(green)的缩写
    B代表着蓝色,是蓝色(blue)的缩写
    在“通道”里面,选择红色后,图层中的白色越多,则表示图片的红色所占比例越大黑色越多代表着红色越少,绿色,蓝色也是代表着这个意思。
    所以在调色上,我们可以遵循三原色的原理来进行调色,具体的使用色卡方法在下面:在这里插入图片描述我来对色卡进行解释,看着红色0度蓝色-120度绿色120度,三个点为基中心,举个例子,如果没有绿色,将0度红色与**-120度蓝色混合,则颜色变为60度的晶红色**,反之可以调出60度黄色180度青色
    调色工具我们一般使用局部曲线工具,在ps中快捷键是Ctrl+M
    假如图片偏**-90度紫**,而我们则需要减少蓝色(将曲线工具中的RGB的蓝色曲线整体拉低),添加** 红色和绿色**(将曲线中的红色和绿色适当的调整)

    展开全文
  • 局部特征

    万次阅读 2012-12-24 16:18:14
    局部特征(1)——入门篇  局部特征 (local features),是近来研究...大家都了解全局特征(global features),就是方差、颜色直方等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话,全局特征用

    (转载请注明来源:http://blog.csdn.net/jiang1st2010/article/details/7621681)    

    局部特征(1)——入门篇

        局部特征 local features),是近来研究的一大热点。大家都了解全局特征(global features),就是方差、颜色直方图等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话,全局特征用来描述总是比较合适的。但是无法分辨出前景和背景却是全局特征本身就有的劣势,特别是在我们关注的对象受到遮挡等影响的时候,全局特征很有可能就被破坏掉了。而所谓局部特征,顾名思义就是一些局部才会出现的特征,这个局部,就是指一些能够稳定出现并且具有良好的可区分性的一些点了。这样在物体不完全受到遮挡的情况下,一些局部特征依然稳定存在,以代表这个物体(甚至这幅图像),方便接下来的分析。我们可以看下面这个图,左边一列是完整图像,中间一列是一些角点(就是接下来我们要讲的局部特征),右边一列则是除去角点以外的线段。不知道你会不会也觉得你看中间一列的时候能更敏感地把他们想象成左边一列的原始物品呢?一方面说,如果我们用这些稳定出现的点来代替整幅图像,可以大大降低图像原有携带的大量信息,起到减少计算量的作用。另一方面,当物体受到干扰时,一些冗余的信息(比如颜色变化平缓的部分和直线)即使被遮挡了,我们依然能够从未被遮挡的特征点上还原重要的信息。

        把局部特征说的这么好听,你也许会问怎样的特征能够被当做局部特征点呢?我们不妨来看下面的这幅图:

        我们选择了3个部分:边缘的点、边缘的线、变化缓慢的天空,当我在左边的图像中选择哪个部分的时候,你最有可能从右边的图像中找到对应的部分来呢?很显然是边缘的点吧-------天空,那么多都是一样的;而边缘,一条直线往左看往右看都是差不多的,你让我选哪个点(这也叫做aperture problem);而顶点相比之下更具有唯一性,所以局部特征最初的研究也就是从角点开始的(比如Harris Corner)。

        一种定量的检测方法,就是通过SSD去比较两个块区域以定义一个相似度,值越小,两个块越相似:

        当然我们应该知道,检测出的块应该和周围有一定的区分性,如何体现这种区分性,不妨做个试验:当前块和它的邻域做匹配,显然自己和自己匹配的时候值最小,而如果周围一定范围的值都特别小,那我们岂不是自己和自己都无法找到匹配,那还拿他当特征干啥?所以如果下式有明显极值,就可以把它当做特征点了。(式中的Δu表示当前块与比较邻域之间的位移)

        这个过程就是早期的Harris Corner的核心思想(如果读者想了解Harris Corner的具体细节,请参见该系列的下一篇博客)。

        总结一下,好的特征应该具有以下几个特点:

           1、重复性:不同图像相同的区域应该能被重复检测到,而且不受到旋转、模糊、光照等因素的影响;

           2、可区分性:不同的检测子,应该可以被区分出来,而为了区分它们,应运而生的就是与检测对应的描述子了;

           3、数量适宜:检测子可别太多,不然啥阿猫阿狗都能出来混,但也不能太少,要求太高可就招不到人才了;

           4、高定位(尺度和位置):是在哪出现的,最好就在哪被找到,可别跑偏了;

           5、有效性:检测速度越快越好。

        在接下来的几篇文章里,我主要针对局部特征,特别是目前使用的特别火热的SIFT特征和SURF特征进行一些描述和总结。这两个特征都是鲁棒性特别好的局部特征,被广泛应用在模式识别方面。

        关于局部特征的更多介绍,请见http://download.csdn.net/download/jiang1st2010/4343689 ,下载ppt查看(免积分)。

     

    局部特征(2)——Harris角点

      在入门篇中偶尔谈到了Harris Corner,在这里我们就重点聊一聊Harris Corner。

           Harris Corner是最典型的角点检测子Corner Detector角点经常被检测在边缘的交界处、被遮挡的边缘、纹理性很强的部分。满足这些条件一般都是稳定的、重复性比较高的点,所以实际上他们是不是角点并不重要(因为我们的目标就是找一些稳定、重复性高的点以作为特征点)。

    Harris Corner基于二阶矩阵:

    这个矩阵描述了局部邻域内梯度的分布情况。矩阵的两个特征值可以用来描述两个主要方向上信号的变化,因此特征值可以用来判决是否为特征点。Harris采用的判别方法是:

    显而易见,cornerness的值越大,对应的两个特征值都应该很大,其中λ取0.04,是为了抑制比较明显的直线。最后对整幅图像得到的cornerness做一个非极大抑制,得到最后的特征点。Harris角点具有的优点是平移不变、旋转不变,能克服一定光照变化。可以先从一个例子上观察Harris Corner实现的过程:

    现在有几个问题:首先为什么3.1式矩阵的两个特征值可以用来描述两个主要方向上信号的变化另外一个问题是为什么3.4式用来决定是否为角点。

    要知道为什么3.1可以作为这个矩阵,我们了解一下具体怎么推出这个式子的,那这又要从Moravec算子说起,步骤如下:

    0将要判断的点置于一个3*35*5的图像块的中心,如下图用红色的线环绕的图像块。

    1将红色的框朝8个方向移动一格,得到蓝色的框(下图为向右上角移动)。导致一个缺点:响应是各向异性的(啥意思?)

    2将红色的框和蓝色的框的相同坐标值的点的像素值相减,并求平方和,可以得到8个值。

    38个值中的最小的值作为角点像素的变化值。(因为角点应该在xy方向上变化都比较大;而在边缘上只可能一个方向大、另一个方向小)

    4求出每一个像素点的角点像素变化值,在局部图像块中,该值最大的点为角点。

    Harris算子将Moravec算子做了两个推广:

    1)用像素的变化梯度代替像素值相减引入高斯窗函数(举个x方向上变化的例子为证)。

    引入高斯窗是为了滤除噪声的干扰。

    [-1,0,1]:x方向上的偏导,[-1,0,1]T:y方向上的偏导。

    2)推广出了一个公式这样可以计算任意方向上的像素值变化,而不在是8个固定的方向。

    (这里的u、v表示x/y方向的位移)

    因为Vuv(x,y)的最小值才是这个点需要被考虑的值,因此我们重写以上表达式:

    看到M矩阵的形式了么?这就是Harris算子的那个原始矩阵,我想推到这里,你也就应该了解Harris矩阵为什么是这样子的了。

    第二个问题:为什么3.4可以用来描述是否为角点。

    可以参考这样一个图:描述了不同纹理下α和β的取值情况:

    a)没有什么纹理的情况下,两个值都很小(很小的正值)

    b)边缘的点,一个值大,另外一个值小(由于k取了很小的值,所以3.4的结果为一个小负值)

    c)角点:两个值都比较大(比较大的正值)

    这样,当我们把目标函数定义为3.4式的时候,得到的结果就会尽力满足两个特征值都比较大了。当然,除此之外,还有Harmonic mean等方式实现更理想的组合方式达到检测出的两个特征值都尽可能大。

    检测效果图(右图进行了旋转)

    局部特征(3)——SURF特征总结

    第一部分:兴趣点的检测

     

    1、 建立积分图。

    优点:任何一个垂直矩形区域的面积只需要进行3次 +/-法就能计算。一阶的haar小波响应只要5次+/-法就能计算。计算的时间和区域大小无关。

     

    2、 建立图像的尺度空间(应该分别有Dxx、Dxy、Dyy 三个尺度金字塔):

    用box filters代替二阶高斯差分模板。



    保持图像的大小不变,对box filters进行尺度变换:建立高斯金字塔,金字塔分为多个Octaves,每个Octave分为4个Scale levels。第一级的Octave的模块大小为9、15、21、27(相差6),第二级为15、27、39、51(相差12),第三级为27、51、75、99(相差24)。每一级第一个level的大小为上一级第二个level的大小。继续建立高斯金字塔,直到filter的大小大于原图像的大小为止(问题是大于每一Octave的第一个mask大小还是最后一个mask的大小?)。


     

    尺度变换的方法,与每个Octave第一个scale level的size(L)/3有关,例如第一个Octave的L为9,L/3=9/3=3,则对于每行/列,连续出现L/3个相同的值,则再插入2个相同的值。若某连续3行同时为1,则再插入两行0。若只连续1行为1,则1*(2/3)=1(四舍五入)。插入的行/列要求左右/上下对称。

     

    3、 对于尺度空间中的每一个box filter,与图像卷积,计算每一点上的Dxx、Dyy、Dxy,再计算每一点Hessian矩阵的行列式。(卷积可以用积分图实现快速计算。)

         

    其中w是因为box filters只是高斯二阶差分的近似,为了使行列式的值大致相等,乘以这个权值,取0.9。注意,每Octave提高一级,计算行列式的时候,采样的间隔提高一倍。例如第一个Octave,每个点都计算,到了第二个Octave,隔一个点计算一个……(用增大模板大小,对图像上的点采样计算的方法,等同于实现对图像进行下采样并改变模板尺度的大小。)

    对于每一个Octave,对计算出行列式的值设一个阈值,大于该阈值的列为候选兴趣点。对候选极值点进行非极大抑制:对于该level的周围8个点以及上下scale level相应位置的9*2个点,一共26个点进行比较行列式的大小,若该点是周围26个点中行列式最大的,则保留。(每一个Octave的头尾两个scale level是没法计算的。)

    为什么可以用Hessian矩阵来判断极小值/极大值,请见最后。 


    最后,内插子像素精确定位(具体未看)。

     

    第二部分:特征描述子

     

    1、 主方向的确定(U-Surf没有此步骤)

    s = 当前mask大小 * 1.2 / 9

    以兴趣点为中心,确定6s为半径的圆。对圆内以s为步长的采样点计算haar小波响应(边长为4s)。

    以兴趣点为中心,对小波响应进行高斯加权()。对一个扇形区间(比如π/3)的水平和垂直方向的小波响应分别求和。最长矢量对应的扇形方向就是主方向。(每一个扇形窗可否有重复?)

     

    2、 以兴趣点为中心,主方向为参考x轴方向,20s为边长,做正方形区域,并将该区域分为4*4个子区域。(SURF-36把它分为3*3个子区域,区分性略差但速度快。)每个子区域取5*5个采样点,计算这些采样点上的haar小波响应dx和dy。以兴趣点为中心,对响应进行高斯加权(σ=3.3s)。

     

    3、 对每个子区域的dx、dy、|dx|、|dy|进行求和,归一化为单位向量。对于4*4个子块一共可以构成64维空间。(SURF-128在统计dx和|dx|时,把dy分为大于0时候和小于0时候两种情况,而在统计dy和|dy|时将dx分为大于0和小于0两种情况,这样每个子区域是8维向量)。


    附:最近的思考(2011.7.10补充):

    1、为什么Hessian矩阵可以用来判断极大值/极小值

    我的理解如下:

    在x0点上,hessian矩阵是正定的,且各分量的一阶偏导数为0,则x0为极小值点。

    在x0点上,hessian矩阵是负定的,且各分量的一阶偏导数为0,则x0为极大值点。

    对于某个局部区域,若hessian矩阵是半正定的,则这个区域是凸的(反之依然成立);若负定,则这个区域是凹的(反之依然成立)。而对于正定和负定来说,Hessian矩阵的行列式总是大于等于0的。反过来就是说:某个点若是极大值/极小值,hessian矩阵的行列式必然要大于等于0,而大于等于0如果是满足的,这个点不一定是极大值/极小值(还要判断一阶导数)。所以后面还要进行极大值抑制。


    与SURF相关的局部特征是SIFT,已经有很多专家对它讨论过了,这里我也不再多谈,如果大家对它感兴趣的话,请看这里,而接下来的这篇博客则对SIFT和SURF做了比较

    局部特征(4)——SIFT和SURF的比较

    (转载请注明来源: http://blog.csdn.net/jiang1st2010/article/details/6567452)


    共同点:

    SIFT/SURF为了实现不同图像中相同场景的匹配,主要包括三个步骤:

    1、尺度空间的建立;

    2、特征点的提取;

    3、利用特征点周围邻域的信息生成特征描述子

    4、特征点匹配。

          从博客上看到一片文章,http://blog.csdn.net/cy513/archive/2009/08/05/4414352.aspx,这一段的大部分内容源于这篇文章,推荐大家去看看。

          如果两幅图像中的物体一般只是旋转和缩放的关系,加上图像的亮度及对比度的不同,要在这些条件下要实现物体之间的匹配,SIFT算法的先驱及其发明者想到只要找到多于三对物体间的匹配点就可以通过射影几何的理论建立它们的一一对应。

          如何找到这样的匹配点呢?SIFT/SURF作者的想法是首先找到图像中的一些“稳定点”,这些点是一些特殊的点,不会因为视角的改变、光照的变化、噪音的干扰而消失,比如角点、边缘点、暗区域的亮点以及亮区域的暗点。这样如果两幅图像中有相同的景物,那么这些稳定点就会在两幅图像的相同景物上同时出现,这样就能实现匹配。因此,SIFT/SURF算法的基础是稳定点。

          SIFT/SURF提取的稳定点,首先都要求是局部极值。但是,当两个物体的大小比例不一样时,大图像的局部极值点在小图像的对应位置上有可能不是极值点。于是SIFT/SURF都采用图像金字塔的方法,每一个截面与原图像相似,这样两个金字塔中就有可能包含大小最近似的两个截面了。

          这样找到的特征点会比较多,经过一些处理后滤掉一些相对不稳定的点。

          接下来如何去匹配相同物体上对应的点呢?SIFT/SURF的作者都想到以特征点为中心,在周围邻域内统计特征,将特征附加到稳定点上,生成特征描述子。在遇到旋转的情况下,作者们都决定找出一个主方向,然后以这个方向为参考坐标进行后面的特征统计,就解决了旋转的问题。


     

    共同的大问题有以下几个:

    1、为什么选用高斯金字塔来作特征提取?

          为什么是DOG的金字塔?因为它接近LOG,而LOG的极值点提供了最稳定的特征,而且DOG方便计算(只要做减法。)

          为什么LOG的极值点提供的特征最稳定,有参考文献,未看。

         (7.12补充:)直观理解:特征明显的点经过不同尺度的高斯滤波器进行滤波后,差别较大,所以用到的是DOG。

          但是直观上怎么理解?如果相邻Octave的sigma不是两倍关系还好理解:如果两幅图像只是缩放的关系,那么假设第一个Octave找到了小一倍图像的极值点,那么大一倍图像的极值点会在下一个Octave找到相似的。但是现在,如果把大一倍图像进行一次下采样(这样和小的图像就完全一样了),进行Gauss滤波时,两个图像滤波系数(sigma)是不一样的,不就找不到一样的极值点了么?不理解。

    2、Hessian矩阵为什么能用来筛选极值点?

          SIFT先利用非极大抑制,再用到Hessian矩阵进行滤除。SURF先用Hessian矩阵,再进行非极大抑制。SURF的顺序可以加快筛选速度么?(Hessian矩阵滤除的点更多?)

          至于SURF先用Hessian矩阵,再进行非极大抑制的原因,是不管先极大值抑制还是判断Hessian矩阵的行列式,金字塔上的点的行列式都是要计算出来的。先判断是否大于0只要进行1次判断,而判断是否是极大值点或者极小值点要与周围26个点比较,只比较1次肯定快。

          而在SIFT中,构建的高斯金字塔只有一座(不想SURF是有3座),要进行非极大抑制可以直接用金字塔的结果进行比较。而如果计算Hessian矩阵的行列式,还要再计算Dxx、Dxy、Dyy。因此先进行非极大抑制。这两个步骤的先后与SIFT/SURF的实际计算情况有关的,都是当前算法下的最佳顺序,而不是说哪种先计算一定更好。

    3、为什么采用梯度特征作为局部不变特征?

          这与人的视觉神经相关。采用梯度作为描述子的原因是,人的视觉皮层上的神经元对特定方向和空间频率的梯度相应很敏感,经过SIFT作者的一些实验验证,用梯度的方法进行匹配效果很好。

    4、为什么可以采用某些特征点的局部不变特征进行整幅图像的匹配?

          我在一份博客上找到这样一句话:(http://apps.hi.baidu.com/share/detail/32318290,大家可以看看这篇文章。)

    从直观的人类视觉印象来看,人类视觉对物体的描述也是局部化的,基于局部不变特征的图像识别方法十分接近于人类视觉机理,通过局部化的特征组合,形成对目标物体的整体印象,这就为局部不变特征提取方法提供了生物学上的解释,因此局部不变特征也得到了广泛应用。

          还有:

          图像中的每个局部区域的重要性和影响范围并非同等重要,即特征不是同等显著的,其主要理论来源是Marr的计算机视觉理论和Treisman的特征整合理论,一般也称为“原子论”。该理论认为视觉的过程开始于对物体的特征性质和简单组成部分的分析,是从局部性质到大范围性质。

          SIFT/SURF都是对特征点的局部区域的描述,这些特征点应该是影响重要的点,对这些点的分析更加重要。所以在局部不变特征的提取和描述时也遵循与人眼视觉注意选择原理相类似的机制,所以SIFT/SURF用于匹配有效果。

     

     

    不同点的比较:

    从博客上看到一个总结,我修改了一些内容。大家可以参看以下链接:

    http://blog.csdn.net/ijuliet/archive/2009/10/07/4640624.aspx

     

    SIFT

    SURF

    尺度空间

    DOG与不同尺度的图片卷积

    不同尺度的box filters与原图片卷积

    特征点检测

    先进行非极大抑制,再去除低对比度的点。再通过Hessian矩阵去除边缘的点

    先利用Hessian矩阵确定候选点,然后进行非极大抑制

    方向

    在正方形区域内统计梯度的幅值的直方图,找max对应的方向。可以有多个方向。

    在圆形区域内,计算各个扇形范围内x、y方向的haar小波响应,找模最大的扇形方向

    特征描述子

    16*16的采样点划分为4*4的区域,计算每个区域的采样点的梯度方向和幅值,统计成8bin直方图,一共4*4*8=128维

    20*20s的区域划分为4*4的子区域,每个子区域找5*5个采样点,计算采样点的haar小波响应,记录∑dx,∑dy,∑|dx|,∑|dy|,一共4*4*4=64维

     SURF—金字塔仅仅是用来做特征点的检测。在计算描述子的时候,haar小波响应是计算在原图像(利用积分图)。而SIFT是计算在高斯金字塔上(注意不是高斯差分金字塔。)

    性能的比较:

    论文:A comparison of SIFT, PCA-SIFT and SURF 对三种方法给出了性能上的比较,源图片来源于Graffiti dataset,对原图像进行尺度、旋转、模糊、亮度变化、仿射变换等变化后,再与原图像进行匹配,统计匹配的效果。效果以可重复出现性为评价指标。

    比较的结果如下:

    method

    Time

    Scale

    Rotation

    Blur

    Illumination

    Affine

    Sift

    common

    best

    best

    common

    common

    good

    Pca-sift

    good

    good

    good

    best

    good

    best

    Surf 

    best

    common

    common

    good

    best

    good

     

     

     

     

     

     

        由此可见,SIFT在尺度和旋转变换的情况下效果最好,SURF在亮度变化下匹配效果最好,在模糊方面优于SIFT,而尺度和旋转的变化不及SIFT,旋转不变上比SIFT差很多。速度上看,SURF是SIFT速度的3倍。

    局部特征(5)——如何利用彩色信息 Color Descriptors

    (转载请注明出处:http://blog.csdn.net/jiang1st2010/article/details/7647766)


            前面两讲中主要是针对SIFT和SURF做了一些介绍。他们的检测子比较稳定,描述子比较鲁棒,好像非常棒的样子。但是有一点非常遗憾,就是他们在对图像进行处理的过程中,都把图像转化为灰度图像进行处理,这样就丢失了颜色信息。而颜色,本身提供了很大的信息量,丢失了特别可惜。很多人可能就会想,如何在描述子中加入颜色信息。在这一讲中,我们就重点介绍一下改进的SIFT/SURF的Color Descriptor。

            这里的Descriptor,其实我们可以把它当做大家传统上理解的特征。而特征,应该具有两个比较重要的特点。第一就是它应该是最有区分度、最有代表性的,应该尽可能减少冗余的信息。如果对于大多数物体来说,这个变量的值非常相近,没有什么区分性,自然不适合做特征。而另一个方面,它应该尽可能的稳定和鲁棒。对于同样的物体来说,当它因为噪声的变化或者图像的旋转、尺度变换等影响时,这个变量的值应该是尽可能不变的(invariant)。 我们要评价一个描述子是否鲁棒,重点就看图像被加入噪声后,形成的描述子是否依然稳定(也就是特征的各维是否不发生变化)。这里所谓的噪声,无外乎以下几种:

            这里几乎把所有可能发生的线性变化都列出来了。可以考虑到,现有的灰度的SIFT/SURF特征对于1-3的变化具有不变性。这主要得益于1)他们都采用梯度的直方图(Haar小波也是计算了梯度),这样可以消除intensity shift。2)RGB的线性变化不影响梯度的方向。3)最终都对描述子向量做了归一化,解决了灰度的尺度变化。这样的话,我们需要考虑的就是如何解决4-5的颜色上的变化了。在此之前,我们先看看目前不用在SIFT/SURF上有哪些颜色特征,然后考虑把这些颜色特征放到描述子中。

            1、RGB histogram,最常见的颜色直方图,你懂的,但是不具有任何不变性,想到这里以后还是换个特征用吧。

            2、Opponent histogram


            O1和O2表征了颜色信息,对lightintensity shift是不变的,不过O3这个直接与灰度相关的变量就不是了。

            3、Hue histogram

            这个大家也熟悉,它对灰度的尺度变化和增量变化具有不变性。所以说HSV颜色空间对于RGB颜色空间,在这一点上有着优势。

            4、rg histogram

            相当于对rgb分量做了一个归一化,归一化之后r/g分量就可以描述图像的颜色信息。其中b分量是多余的,因为r+g+b=1。Rg直方图对light intensity change是不变的,对于存在阴影的场景中可以尝试用。


            5、transformed colorhistogram

            考虑到rgb直方图对于灰度和颜色的线性变化不具有任何不变性,但是如果我们考虑对RGB三个通道分别做归一化,归一化的方法如:


            这样,通过减去均值可以抵消各通道的valueshift,通过除以方差可以抵消各通道的value scale change。(均值和方差以待统计的块为单位进行计算。)这样归一化之后的直方图对于light color change and shift是具有不变性的。

     

            列举了颜色直方图的几种统计方法之后,我们可以把他们用在SIFT/SURF描述子之中。因为传统的SIFT/SURF描述子是对单通道进行统计的,当使用上述特征进行统计时,就是对多个通道分别计算描述子,最后形成一个多维的特征作为颜色描述子。重点想提一下的就是:

            C-SIFT:利用Opponentinformation中的 O1/O3和O2/O3作为颜色特征,这么做的目的是为了消除O1和O2中的灰度信息,但是,这样做却不能对intensity shift有不变性。

            Transformedcolor SIFT:这个特征将不仅对灰度的change和shift具有不变性,同时还对各颜色的shift和change都具有不变性;

            RGB-SIFT:很有意思的就是由于Transformedcolor SIFT对各通道的线性变化都具有不变性,而Transformed就是RGB特征经过线性变换而来,因此RGB-SIFT和Transformed color SIFT具有同样的不变性(效果是一样的)。

           最后,对上面介绍的所有特征的不变性做一个总结,见下表,其中“+”表示对这一变化具有不变性,“-”则表示不具有这种不变性。


    转载请注明出处:http://blog.csdn.net/jiang1st2010/article/details/7647766



     

    展开全文
  • Phansalkar 方法描述于: N. Phansalkar、S. More、A. Sabale 和 M. Joshi,“用于检测多样性染色细胞学图像中细胞核的自适应局部阈值”,2011 年国际通信和信号处理会议,2011 年,第 218-220 页: IEEE。
  • 樊彬中国科学院自动化研究所 模式识别国家重点实验室 (CASIA NLPR) 局部图像特征描述是计算机视觉的一个基本研究问题,在寻找图像中的对应点以及物体特征描述中有着重要的作用。它是许多方法的基础,因此也是目前...
  • 图像局部不变性特征描述

    千次阅读 2015-06-13 02:04:09
    图像局部不变性特征描述chapter 2 2.2.1 multi scale and multi resolution (size of image) pyramid – multi resolutionscale space – same resolution – 图像局部结构可以用简单形式在不同尺度上描述出来2.2.2 ...
  • 局部加权回归

    2017-02-09 20:51:00
    意思是每次预测数据需要依赖训练训练集,所以每次估计的参数值是不确定的。 局部加权回归优点: 需要预测的数据仅与到训练数据的距离有关,距离越近,关系越大,反之越小; 可以有效避免欠拟合,减小了...
  • 陷入局部最优其实不是神经网络的问题,在一个非常高维的空间中做梯度下降,这时的local minimum是很难形成的,因为局部最小值要求函数在所有维度上都是局部最小的。实际情况是,函数会落在一个saddle-point上。 在...
  • 一、pandas是什么? 二、使用步骤 1.引入库 2.读入数据 总结 前言 Visionpro软件功能强大,但是也有许多工具,软件本身没有实现,需要调用第三方库。本为通过Visionpro脚本加载opencv动态连接库,实现...
  • 马甲包的字面意思给产品穿马甲,但是我认为马甲包更像...一、什么是马甲包 马甲包是利用App store 规则漏洞,通过技术手段,多次上架同一款产品的方法。马甲包和主产品包拥有同样的内容和功能,除了icon和应用名称不
  • 图像处理冈萨雷斯局部直方处理(Local Histogram Processing)局部直方均衡化解决办法:直方统计(Histogram Statistics)合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的...
  • 局部图像处理

    千次阅读 2017-11-23 20:29:54
    局部特征(1)——入门篇  局部特征 (local features),是近来...大家都了解全局特征(global features),就是方差、颜色直方等等。如果用户对整个图像的整体感兴趣,而不是前景本身感兴趣的话,全局特征用来描
  • 橱窗推荐是什么意思,有什么用?

    千次阅读 2012-09-15 15:54:40
    橱窗推荐是什么意思,有什么用?      现在越来越多的淘宝卖家意识到了橱窗推荐的作用,运用橱窗推荐去推广自己的宝贝。... 一、什么是橱窗推荐    橱窗推荐简单的说就是,假如你有100件宝
  • 分布式是什么意思

    千次阅读 2014-08-20 14:51:48
    什么是分布式智能? NI LabVIEW 8的分布式智能结合了相关的技术和工具,解决了分布式系统开发会碰到的一些挑战。更重要的是,NI LabVIEW 8的分布式智能提供的解决方案不仅令这些挑战迎刃而解,且易于实施。LabVIEW 8...
  • 前面说过的,有怎样画局部放大的,例如左边放原,右边放局部放大的,并且在原中用一个方框或者什么,把要放大的部分框起来,需要的话还可以用两条线从方框指向放大的, 效果如下所示, 这里主要介绍...
  • 例如在检测网络中,一个图像输入到网络中,经过一层层的卷积之后,语义信息会越来越明显,但是相对的位置信息会越来越弱,因为越到高层卷积的时候,feature map映射到原中的感受野越大,这样对局部的位置信息感受...
  • android 局部更新

    2017-06-04 17:19:30
     有的LCD是支持局部刷新的,所谓局部刷新也就是说,如果UI层有更新,驱动才会去刷新framebuffer的区域,并且只需要刷新这块脏的区域,这需要LCD本身有一个缓存,能够保持framebuffer上一帧的数据; Android 2.1...
  • 全连接、局部连接、全卷积与局部卷积 ​ 大多数神经网络中高层网络通常会采用全连接层(Global Connected Layer),通过多对多的连接方式对特征进行全局汇总,可以有效地提取全局信息。但是全连接的方式需要大量的参数...
  • 全局路径规划和局部路径规划并没有本质上的区别,很多适用于全局路径规划的方法经过改进也可以用于局部路径规划,而适用于局部路径规划的方法同样经过改进后也可适用于全局路径规划。两者协同工作,机器人可更好的...
  • C++之局部变量

    2017-11-08 23:15:09
    分析:在函数内部声明的变量为局部变量,局部变量的意思即该变量只存活在该函数中,加入该函数调用结束,那么该变量的寿命也结束了。 结论:main函数中调用前后,变量的值不变,只交换了swap函数中参数的值
  • Fluent截取局部

    千次阅读 2020-11-23 20:54:54
    fluent中截取局部面一、正常create plane二、bounded 建立局部面三、create iso/surface四、在画网格时,就在需要的地方建立面 在使用fluent模拟时,我们经常需要对某一个面监测或者计算某一个面的物理量,直接...
  • 首先,什么是局部能量特征,看一下定义, s ( i , j ) = ∑ m ∑ n C ( i + m , j + n ) 2 s(i,j)=\sum_m\sum_nC(i+m,j+n)^2 s ( i , j ) = ∑ m ​ ∑ n ​ C ( i + m , j + n ) 2 ,什么意思呢,就是对于图像s,在...
  • GitHub 的 Fork 是什么意思

    千次阅读 2017-06-22 11:39:47
    fork是什么意思_fork在线翻译 。 2. 在计算机中,Fork一词的使用 2.1 Git/GitHub仓库克隆 Git/GitHub 用户下面的 来表达 Fork:分叉、克隆 出一个(仓库的)新拷贝。 &lt;img src="...
  • 【笔记】局部特征

    2020-03-12 21:58:40
    全局特征是指图像的整体属性,常见的全局特征包括颜色特征、纹理特征和形状特征,比如强度直方等。由于是像素级的低层可视特征,因此,全局特征具有良好的不变性、计算简单、表示直观等特点,但特征维数高、计算量...
  • 图像局部特征(十八)--BOW

    千次阅读 2016-07-19 10:11:27
    没有什么特别的理论推导,我觉得仅仅只是将类似SIFT、HOG这些局部特征的统计方法从微观扩展到宏观的过程,利用直方的统计的特性,构造多个词典,利用简单的距离映射,得到每一副图片的BOW的特征,但是这样一个简单...
  • Android 局部刷新

    千次阅读 2010-07-20 08:32:00
    需求:  有的LCD是支持局部刷新的...Android本身是提供了这个局部刷新的支持的,不过默认并没有启用,如所示: <br />这个init在执行的时候首先会查询opengl所支持的扩展,看是否支持EGL_AND
  • 这是无意思遇到收集的,用JS做的对图片局部放大的效果 就像放大镜一样的效果
  • slam是什么意思?一文带你读懂SLAM

    万次阅读 2018-09-17 14:11:10
    SLAM可以快速构建局部3D地图,并与地理信息系统(GIS)、视觉对象识别技术相结合,可以辅助无人机识别路障并自动避障规划路径,曾经刷爆美国朋友圈的Hovercamera无人机,就应用到了SLAM技术。   无人驾驶领域...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 90,460
精华内容 36,184
关键字:

局部图是什么意思