为什么aHash比dHash更好?

时间:2016-02-13 20:15:23

标签: c++ opencv image-processing hash computer-vision

我在使用aHash和dHash时遇到了一些问题: http://www.hackerfactor.com/blog/?/archives/529-Kind-of-Like-That.html

我使用的是C ++和OpenCV

问题是dHash比aHash更糟糕。虽然理论上应该更好。例如: 我选择了一张图片,对其进行了一些操作并计算了原始图像和修改图像的哈希值之间的汉明距离。 The result is there

这是aHash的功能

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.asteam.unify.Mbajtje">

<ScrollView
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:fillViewport="true"
    android:layout_marginRight="@dimen/general_margin"
    android:layout_marginLeft="@dimen/general_margin">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/lendaText"
            android:layout_marginTop="@dimen/general_margin"
            android:text="Lënda:"/>

        <Spinner
            android:id="@+id/lendaMbajtje"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/lendaText"
            android:textSize="@dimen/font_size"
            android:background="@drawable/border_bottom"/>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/subjektiText"
            android:layout_marginTop="@dimen/general_margin"
            android:layout_below="@id/lendaMbajtje"
            android:text="Subjekti:"/>

        <Spinner
            android:id="@+id/subjektiMbajtje"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@id/subjektiText"
            android:textSize="@dimen/font_size"
            android:background="@drawable/border_bottom"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/subjektiMbajtje"
            android:id="@+id/detajetMbajtjesText"
            android:orientation="horizontal">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_marginRight="@dimen/general_margin"
                android:layout_weight="3">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:layout_weight="1"
                    android:text="Data e mbajtjes:"/>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_weight="1"
                    android:id="@+id/dates"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">

                    <EditText
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/dayMbajtje"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:textSize="@dimen/font_size"
                        android:gravity="center"
                        android:layout_marginRight="5dp"
                        android:text="12"
                        android:paddingBottom="@dimen/padding_spiner"
                        android:singleLine="true"
                        android:inputType="number"
                        android:imeOptions="actionNext"/>

                    <Spinner
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/monthMbajtje"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:textSize="@dimen/font_size"
                        android:layout_marginRight="5dp"
                        android:text="02"/>

                    <Spinner
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/yearMbajtje"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:textSize="@dimen/font_size"
                        android:text="2016"/>

                </LinearLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_marginLeft="@dimen/general_margin"
                android:layout_weight="2">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:layout_weight="1"
                    android:text="Ora e mbajtjes:"/>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_weight="1"
                    android:layout_marginTop="3dp"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

                    <EditText
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/hourMbajtje"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:textSize="@dimen/font_size"
                        android:text="22"
                        android:paddingBottom="@dimen/padding_spiner"
                        android:singleLine="true"
                        android:inputType="number"
                        android:imeOptions="actionNext"/>

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:text=":"/>

                    <EditText
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:id="@+id/minutesMbajtje"
                        android:textSize="@dimen/font_size"
                        android:gravity="center"
                        android:text="20"
                        android:paddingBottom="@dimen/padding_spiner"
                        android:singleLine="true"
                        android:inputType="number"
                        android:imeOptions="actionNext"/>

                </LinearLayout>

            </LinearLayout>

        </LinearLayout>

        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_below="@+id/detajetMbajtjesText"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:layout_marginTop="@dimen/vertical_padding"
            android:id="@+id/duttyCount"
            android:visibility="gone">

        <LinearLayout
            android:layout_width="wrap_content"
            android:orientation="horizontal"
            android:id="@+id/duttyView"
            android:layout_alignParentLeft="true"
            android:layout_height="wrap_content">

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:layout_weight="2"
                android:gravity="center_vertical"
                android:layout_marginRight="@dimen/margin_spiner"
                android:text="Detyra e :"/>

            <Spinner
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:id="@+id/duttyCountS"
                android:background="@drawable/border_bottom"
                android:layout_weight="1"
                android:gravity="center"
                android:text="parë"/>

        </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:orientation="horizontal"
                android:layout_alignParentRight="true"
                android:id="@+id/checkboxPresentationLinear"
                android:layout_height="wrap_content">

                <CheckBox
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:text="Prezantim"
                    android:layout_gravity="right"
                    android:id="@+id/presentationDutty"
                    android:imeOptions="actionNext"/>

            </LinearLayout>

        </RelativeLayout>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/duttyCount"
            android:id="@+id/detajetMbajtjesPrezantimText"
            android:orientation="horizontal"
            android:visibility="gone"
            android:showDividers="end">

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_marginRight="@dimen/general_margin"
                android:layout_weight="3">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:layout_weight="1"
                    android:text="Data e prezantimit:"/>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_weight="1"
                    android:id="@+id/datesPresentation"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="3dp"
                    android:orientation="horizontal">

                    <EditText
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/dayPresentation"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:textSize="@dimen/font_size"
                        android:gravity="center"
                        android:layout_marginRight="5dp"
                        android:text="12"
                        android:paddingBottom="@dimen/padding_spiner"
                        android:singleLine="true"
                        android:inputType="number"
                        android:imeOptions="actionNext"/>

                    <Spinner
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/monthPresentation"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:textSize="@dimen/font_size"
                        android:layout_marginRight="5dp"
                        android:text="02"/>

                    <Spinner
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/yearPresentation"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:textSize="@dimen/font_size"
                        android:text="2016"/>

                </LinearLayout>

            </LinearLayout>

            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="vertical"
                android:layout_marginLeft="@dimen/general_margin"
                android:layout_weight="2">

                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_marginTop="15dp"
                    android:layout_weight="1"
                    android:text="Ora e prezantimit:"/>

                <LinearLayout
                    android:layout_width="match_parent"
                    android:layout_weight="1"
                    android:layout_marginTop="3dp"
                    android:layout_height="wrap_content"
                    android:orientation="horizontal">

                    <EditText
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:id="@+id/hourPresentation"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:textSize="@dimen/font_size"
                        android:text="22"
                        android:paddingBottom="@dimen/padding_spiner"
                        android:singleLine="true"
                        android:inputType="number"
                        android:imeOptions="actionNext"/>

                    <TextView
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:layout_weight="1"
                        android:gravity="center"
                        android:text=":"/>

                    <EditText
                        android:layout_width="wrap_content"
                        android:layout_height="wrap_content"
                        android:background="@drawable/border_bottom"
                        android:layout_weight="1"
                        android:id="@+id/minutesPresentation"
                        android:textSize="@dimen/font_size"
                        android:gravity="center"
                        android:text="20"
                        android:paddingBottom="@dimen/padding_spiner"
                        android:singleLine="true"
                        android:inputType="number"
                        android:imeOptions="actionNext"/>

                </LinearLayout>

            </LinearLayout>

        </LinearLayout>

        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/psText"
            android:layout_marginTop="@dimen/general_margin"
            android:layout_below="@+id/detajetMbajtjesPrezantimText"
            android:text="P.s."/>

        <EditText
            android:layout_width="match_parent"
            android:layout_height="150dp"
            android:inputType="textMultiLine"
            android:id="@+id/psTextArea"
            android:padding="@dimen/padding_spiner"
            android:layout_below="@+id/psText"
            android:layout_marginTop="@dimen/padding_spiner"
            android:textSize="@dimen/font_size"
            android:gravity="top"
            android:background="@drawable/border_textarea"
            android:imeOptions="actionDone"/>

        <Button
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="New Button"
            android:id="@+id/previewMbajtje"
            android:layout_below="@+id/psTextArea"
            android:layout_centerHorizontal="true" />

    </RelativeLayout>

</ScrollView>

和dHash的功能

 public void getSound(int f, int time) throws LineUnavailableException{
   byte[] buf = new byte[ 1 ];
 AudioFormat af = new AudioFormat( (float)44100, 8, 1, true, false );
  SourceDataLine sdl = AudioSystem.getSourceDataLine( af );
 sdl.open();
 sdl.start();
 for( int i = 0; i < 1000 * (float)time / 1000; i++ ) {
     double angle = i / ((float)f / 440 ) * 2.0 * Math.PI;
     buf[ 0 ] = (byte)( Math.sin(angle ) * 100 );
     sdl.write( buf, 0, 1 );
 }

 sdl.drain();
 sdl.stop();

}

1 个答案:

答案 0 :(得分:0)

以防万一也有人碰到这个问题,我注意到dhash在插图和某些艺术品方面有一个特定的弱点。

更具体地说,对于对比度非常低或包含大面积纯色的任何图像,它倾向于随机性。我正在处理一组艺术照片,这个问题在草图,线条画或艺术品本身由纯色路路通框起来的地方尤为突出。

发生这种情况的原因很明显:实心区域很容易随机地看到一个片段比相邻片段的亮度略高,甚至有很小的有损压缩失真。但是我对它的大小感到有些惊讶:将图像缩放50%通常会导致肉眼无法分辨图像,但是dhash差接近随机性。

我已经看到了一些改进,通过使比较不是关于> = vs <,而是增加了一些任意的偏差,例如,需要> =(b + 15)。这里的理由是纯色相对丰富,但是线性渐变(会再次导致相同的病理类型)相对很少。如果仍然存在问题,也可以使偏差随机,但取决于位置,即e。 “在(x = 3,y = 5)处加12,在x = 20,y = 5处减去3。具有匹配图案的大量图像的概率将远低于纯色且规定良好的图像渐变。