資源簡介
預處理:讀取圖片
第一步,縮小尺寸。
將圖片縮小到8x8的尺寸,總共64個像素。這一步的作用是去除圖片的細節,只保留結構、明暗等基本信息,摒棄不同尺寸、比例帶來的圖片差異。
第二步,簡化色彩。
將縮小后的圖片,轉為64級灰度。也就是說,所有像素點總共只有64種顏色。
第三步,計算平均值。
計算所有64個像素的灰度平均值。
第四步,比較像素的灰度。
將每個像素的灰度,與平均值進行比較。大于或等于平均值,記為1;小于平均值,記為0。
第五步,計算哈希值。
將上一步的比較結果,組合在一起,就構成了一個64位的整數,這就是這張圖片的指紋。組合的次序并不重要,只要保證所有圖片都采用同樣次序就行了。
得到指紋以后,就可以對比不同的圖片,看看64位中有多少位是不一樣的。在理論上,這等同于計算"漢明距離"(Hammingdistance)。如果不相同的數據位不超過5,就說明兩張圖片很相似;如果大于10,就說明這是兩張不同的圖片。
你可以將幾張圖片放在一起,也計算出他們的漢明距離對比,就可以看看兩張圖片是否相似。
這種算法的優點是簡單快速,不受圖片大小縮放的影響,缺點是圖片的內容不能變更。如果在圖片上加幾個文字,它就認不出來了。所以,它的最佳用途是根據縮略圖,找出原圖。
實際應用中,往往采用更強大的pHash算法和SIFT算法,它們能夠識別圖片的變形。只要變形程度不超過25%,它們就能匹配原圖。這些算法雖然更復雜,但是原理與上面的簡便算法是一樣的,就是先將圖片轉化成Hash字符串,然后再進行比較。
以上內容大部分直接從阮一峰的網站上復制過來,想看原著的童鞋可以去在最上面的鏈接點擊進去看。

代碼片段和文件信息
package?com.yjf.image;
import?java.awt.AlphaComposite;
import?java.awt.Color;
import?java.awt.Font;
import?java.awt.Graphics2D;
import?java.awt.Image;
import?java.awt.RenderingHints;
import?java.awt.geom.AffineTransform;
import?java.awt.image.BufferedImage;
import?java.awt.image.ColorModel;
import?java.awt.image.WritableRaster;
import?java.io.File;
import?java.io.FileInputStream;
import?java.io.FileNotFoundException;
import?java.io.FileOutputStream;
import?java.io.IOException;
import?java.io.InputStream;
import?javax.imageio.ImageIO;
import?com.sun.image.codec.jpeg.ImageFormatException;
import?com.sun.image.codec.jpeg.JPEGCodec;
import?com.sun.image.codec.jpeg.JPEGImageDecoder;
import?com.sun.image.codec.jpeg.JPEGImageEncoder;
/**
?*?圖片工具類,主要針對圖片水印處理
?*?
?*?@author??025079
?*?@version??[版本號?2011-11-28]
?*?@see??[相關類/方法]
?*?@since??[產品/模塊版本]
?*/
public?class?ImageHelper?{
//?項目根目錄路徑
public?static?final?String?path?=?System.getProperty(“user.dir“);
/**
?*?生成縮略圖?
?*?保存:ImageIO.write(BufferedImage?imgType[jpg/png/...]?File);
?*?
?*?@param?source
?*????????????原圖片
?*?@param?width
?*????????????縮略圖寬
?*?@param?height
?*????????????縮略圖高
?*?@param?b
?*????????????是否等比縮放
?*?*/
public?static?BufferedImage?thumb(BufferedImage?source?int?width
int?height?boolean?b)?{
//?targetW,targetH分別表示目標長和寬
int?type?=?source.getType();
BufferedImage?target?=?null;
double?sx?=?(double)?width?/?source.getWidth();
double?sy?=?(double)?height?/?source.getHeight();
if?(b)?{
if?(sx?>?sy)?{
sx?=?sy;
width?=?(int)?(sx?*?source.getWidth());
}?else?{
sy?=?sx;
height?=?(int)?(sy?*?source.getHeight());
}
}
if?(type?==?BufferedImage.TYPE_CUSTOM)?{?//?handmade
ColorModel?cm?=?source.getColorModel();
WritableRaster?raster?=?cm.createCompatibleWritableRaster(width
height);
boolean?alphaPremultiplied?=?cm.isAlphaPremultiplied();
target?=?new?BufferedImage(cm?raster?alphaPremultiplied?null);
}?else
target?=?new?BufferedImage(width?height?type);
Graphics2D?g?=?target.createGraphics();
//?smoother?than?exlax:
g.setRenderingHint(RenderingHints.KEY_RENDERING
RenderingHints.VALUE_RENDER_QUALITY);
g.drawRenderedImage(source?AffineTransform.getScaleInstance(sx?sy));
g.dispose();
return?target;
}
/**
?*?圖片水印
?*?
?*?@param?imgPath
?*????????????待處理圖片
?*?@param?markPath
?*????????????水印圖片
?*?@param?x
?*????????????水印位于圖片左上角的?x?坐標值
?*?@param?y
?*????????????水印位于圖片左上角的?y?坐標值
?*?@param?alpha
?*????????????水印透明度?0.1f?~?1.0f
?*?*/
public?static?void?waterMark(String?imgPath?String?markPath?int?x?int?y
float?alpha)?{
try?{
//?加載待處理圖片文件
Image?img?=?ImageIO.read(new?File(imgPath));
BufferedImage?image?=?new?BufferedImage(img.getWidth(null)
img.getHeight(null)?BufferedImage.TYPE_INT_RGB);
Graphics2D?g?=?image.createGraphics();
g.drawImage(img?0?0?null);
//?加載水印圖片文件
Image?src_biao?=?ImageIO.read(new?File(markPath));
g.setCo
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件????????548??2011-11-28?19:46??圖片相似度識別\SimilarImageSearch\.classpath
?????文件????????394??2011-11-28?19:43??圖片相似度識別\SimilarImageSearch\.project
?????文件????????629??2011-11-28?19:43??圖片相似度識別\SimilarImageSearch\.settings\org.eclipse.jdt.core.prefs
?????文件???????6239??2012-04-17?13:29??圖片相似度識別\SimilarImageSearch\bin\com\yjf\image\ImageHelper.class
?????文件???????4084??2012-04-17?13:29??圖片相似度識別\SimilarImageSearch\bin\com\yjf\image\SimilarImageSearch.class
?????文件????????279??2012-04-17?13:33??圖片相似度識別\SimilarImageSearch\bin\readme.txt
?????文件??????47657??2011-09-15?14:10??圖片相似度識別\SimilarImageSearch\images\example1.jpg
?????文件???????8434??2011-11-29?13:51??圖片相似度識別\SimilarImageSearch\images\example2.jpg
?????文件??????28065??2012-04-17?13:21??圖片相似度識別\SimilarImageSearch\images\example3.jpg
?????文件??????24759??2011-11-29?13:53??圖片相似度識別\SimilarImageSearch\images\example4.jpg
?????文件??????40815??2011-11-29?13:51??圖片相似度識別\SimilarImageSearch\images\example5.jpg
?????文件??????11837??2012-04-17?13:31??圖片相似度識別\SimilarImageSearch\images\example6.jpg
?????文件??????63859??2011-11-29?13:59??圖片相似度識別\SimilarImageSearch\images\source.jpg
?????文件???????6431??2012-04-17?13:29??圖片相似度識別\SimilarImageSearch\src\com\yjf\image\ImageHelper.java
?????文件???????4583??2012-04-17?13:29??圖片相似度識別\SimilarImageSearch\src\com\yjf\image\SimilarImageSearch.java
?????文件????????332??2013-03-06?13:32??圖片相似度識別\SimilarImageSearch\src\readme.txt
?????目錄??????????0??2012-04-17?13:29??圖片相似度識別\SimilarImageSearch\bin\com\yjf\image
?????目錄??????????0??2011-11-29?09:03??圖片相似度識別\SimilarImageSearch\src\com\yjf\image
?????目錄??????????0??2012-04-17?13:29??圖片相似度識別\SimilarImageSearch\bin\com\yjf
?????目錄??????????0??2012-04-17?13:29??圖片相似度識別\SimilarImageSearch\src\com\yjf
?????目錄??????????0??2012-04-17?13:10??圖片相似度識別\SimilarImageSearch\bin\com
?????目錄??????????0??2011-11-29?09:03??圖片相似度識別\SimilarImageSearch\src\com
?????目錄??????????0??2011-11-29?09:03??圖片相似度識別\SimilarImageSearch\.settings
?????目錄??????????0??2011-12-24?15:24??圖片相似度識別\SimilarImageSearch\bin
?????目錄??????????0??2011-11-29?14:05??圖片相似度識別\SimilarImageSearch\images
?????目錄??????????0??2011-11-29?09:03??圖片相似度識別\SimilarImageSearch\src
?????目錄??????????0??2011-11-29?09:03??圖片相似度識別\SimilarImageSearch
?????目錄??????????0??2013-03-06?13:33??圖片相似度識別
-----------?---------??----------?-----??----
???????????????248945????????????????????28
............此處省略1個文件信息
- 上一篇:吉林大學《計算智能》課程的課件
- 下一篇:二階倒立擺滑膜變結構
評論
共有 條評論