青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-20  評(píng)論-12  文章-0  trackbacks-0
使用方法:先執(zhí)行dir *.jpg *.bmp /b /s > imgcmp.lst,然后替換掉原來的imgcmp.lst雙擊執(zhí)行imgcmp.exe.
哈哈windows目錄下面相同或者相似的文件還是蠻多的嘛.
閾值是相關(guān)度判斷是否是相似圖片的閾值,塊大小是圖片的分塊像素大小.
可執(zhí)行文件下載:
下面是截圖欣賞:





  1 RBT<Pair<String,String> > img_map;
  2 Int g_limit = 2;
  3 Int g_block = 32;
  4 
  5 RGBQUAD pixel_comp(CxImage* pImageSrc, CxImage* pImageDst,Int& nResult,Byte limit = 20)
  6 {
  7     Int src_row = pImageSrc->GetHeight();
  8     Int src_col = pImageSrc->GetWidth();
  9     Byte* src_buffer = pImageSrc->GetBits();
 10     Int dst_row = pImageDst->GetHeight();
 11     Int dst_col = pImageDst->GetWidth();
 12     Byte* dst_buffer = pImageDst->GetBits();
 13     RGBQUAD ret = {-1,-1,-1,-1}, max_ret = {0};
 14     if(src_row!=dst_row || src_col!=dst_col) 
 15     {
 16         nResult = (dst_row+2)*(dst_col+1)-(src_row+2)*(src_col+1);
 17         return ret;
 18     }
 19 
 20     Double r = 0,g = 0,b = 0,s = 0;
 21     Double abs_r = 0,abs_g = 0,abs_b = 0,abs_s = 0;
 22     Char delta_r = 0, delta_g = 0, delta_b = 0;
 23     Int Block_Row = g_block;
 24     Int Block_Col = g_block;
 25 #define Abs(x) ((x)>=0?(x):-(x))
 26     for(Int i=0; i<(src_row+Block_Row-1)/Block_Row; i++)
 27     {
 28         for(Int j=0; j<(src_col+Block_Col-1)/Block_Col; j++)
 29         {
 30             Double l_r = 0,l_g = 0,l_b = 0,l_s = 0;
 31             Double l_abs_r = 0,l_abs_g = 0,l_abs_b = 0,l_abs_s = 0;
 32             for(Int k=0; k<Block_Row; k++)
 33             {
 34                 for(Int l=0; l<Block_Col; l++)
 35                 {
 36                     register Int row = i*Block_Row+k;
 37                     register Int idx = j*Block_Col+l;
 38                     if(row>=src_row || idx>=src_col) continue;
 39                     idx += row*src_col;
 40                     delta_b = dst_buffer[idx*3  ]-src_buffer[idx*3  ];
 41                     delta_g = dst_buffer[idx*3+1]-src_buffer[idx*3+1];
 42                     delta_r = dst_buffer[idx*3+2]-src_buffer[idx*3+2];
 43 
 44                     l_b += (delta_b);
 45                     l_g += (delta_g);
 46                     l_r += (delta_r);
 47 
 48                     l_abs_b += Abs(delta_b);
 49                     l_abs_g += Abs(delta_g);
 50                     l_abs_r += Abs(delta_r);
 51                 }
 52             }
 53             if(    (max_ret.rgbBlue =(Byte)l_abs_b/Block_Row/Block_Col)>limit ||
 54                 (max_ret.rgbGreen=(Byte)l_abs_g/Block_Row/Block_Col)>limit ||
 55                 (max_ret.rgbRed  =(Byte)l_abs_r/Block_Row/Block_Col)>limit )
 56             {
 57                 return max_ret;
 58             }
 59 
 60             b += l_b;
 61             g += l_g;
 62             r += l_r;
 63 
 64             abs_b += l_abs_b;
 65             abs_g += l_abs_g;
 66             abs_r += l_abs_r;
 67         }
 68     }
 69 #undef Abs
 70     max_ret.rgbRed = (Byte)(abs_r/src_row/src_col);
 71     max_ret.rgbGreen = (Byte)(abs_g/src_row/src_col);
 72     max_ret.rgbBlue = (Byte)(abs_b/src_row/src_col);
 73     nResult = (Int)((r+g+b)/src_row/src_col);
 74     return max_ret;
 75 }
 76 
 77 template <typename T>
 78 T jabs(T t)
 79 {
 80     if((t | ((T)(-1)>>1)) == (T)(-1))
 81         return 0-t;
 82     else
 83         return t;
 84 }
 85 
 86 Int symbol(Int p)
 87 {
 88     return p>=0?p:-p;
 89 }
 90 
 91 CStr next_sub(CStr pchSrc, Char match = '\\')
 92 {
 93     int len = strlen(pchSrc);
 94     for(int i=len-1; i>=0; i--)
 95     {
 96         if(pchSrc[i]==match)
 97             return pchSrc+i+1;
 98     }
 99     return 0;
100 }
101 
102 Int img_comp(CStr pchFileSrc,CxImage* img_src,CStr pchFileDst,CxImage* img_dst,Byte limit = 2)
103 {
104     CStr tmp_str = Nul;
105     if(strcmp(pchFileSrc,pchFileDst)==0return 0;
106     if(!img_src->IsValid())
107     {
108         printf("parse image (%s) failure!\n",pchFileSrc);
109         throw "parse image failure!";
110     }
111     if(!img_dst->IsValid())
112     {
113         printf("parse image (%s) failure!\n",pchFileDst);
114         throw "parse image failure!";
115     }
116     Int nResult;
117     RGBQUAD t = pixel_comp(img_src,img_dst,nResult);
118 
119     if(*(Int*)&== -1// 長寬不同,則按名字排序
120         return (Int)nResult;
121     else if(jabs(t.rgbBlue)<limit && jabs(t.rgbGreen)<limit && jabs(t.rgbRed)<limit && jabs(t.rgbReserved)<limit)
122     {
123         if(strcmp(pchFileDst,pchFileSrc)!=0)
124         {
125             img_map.Insert(Pair<String,String>(String(pchFileSrc),String(pchFileDst)));
126             img_map.Insert(Pair<String,String>(String(pchFileDst),String(pchFileSrc)));
127         }
128         return 0;
129     }
130     else 
131         return (Int)nResult;
132 }
133 
134 class ImageCmp
135 {
136 public:
137     Bool operator<(ImageCmp& img)
138     {
139         try{
140             return img_comp(_img_src.ConvertToCStr(),_img,img._img_src.ConvertToCStr(),img._img,g_limit)<0;
141         }catch(){return False;}
142     }
143     CStr GetSrc()                                                                        { return _img_src.ConvertToCStr(); }
144     ImageCmp(CStr pchImgSrc) : _img_src(pchImgSrc)
145     {
146         _img = New CxImage(pchImgSrc,CxImage::GetTypeIdFromName(next_sub(pchImgSrc,'.')));
147     }
148     ImageCmp(const String& sImgSrc) : _img_src(sImgSrc)
149     {
150         CStr tmp_str = Nul;
151         _img = New CxImage(sImgSrc.ConvertToCStr(),CxImage::GetTypeIdFromName(next_sub(sImgSrc.ConvertToCStr(),'.')));
152     }
153     ImageCmp()                                                                            {_img = New CxImage();}
154     AutoPtr<CxImage> _img;
155 protected:
156     String _img_src;
157 };
158 
159 int main()
160 {
161     printf("閾值:");
162     scanf("%d",&g_limit);
163     printf("塊大小:");
164     scanf("%d",&g_block);
165     CStr name_cfg = "imgcmp.lst";
166     Char buffer[MAX_PATH+1= {0};
167     Vector<ImageCmp> vec_file;
168     FILE* file_cfg = fopen(name_cfg,"r");
169     printf("loading.");
170     if(file_cfg)
171     {
172         String last;
173         while(!feof(file_cfg))
174         {
175             String tmp;
176             fgets(buffer,MAX_PATH,file_cfg);
177             tmp = buffer;
178             tmp.Trim();
179             if(!tmp.IsEmpty() && tmp!=last)
180             {
181                 vec_file.PushBack(tmp);
182                 printf(".");
183             }
184             last = tmp;
185         }
186         fclose(file_cfg);
187         file_cfg = Nul;
188     }
189     printf("\nParsing\n");
190 
191     fast_sort<ImageCmp,Vector<ImageCmp> >(vec_file,0,vec_file.GetSize()-1);
192     printf("results:\n");
193     
194     FILE* html = fopen("output.html","w");
195     fprintf(html,"<HTML><HEAD><TITLE>圖片相似度搜索</TITLE></HEAD><BODY>\n");
196     Bool has_line_draw = False;
197     String last_name;
198     for(UInt i=0; i<vec_file.GetSize(); i++)
199     {
200         RBT<Pair<String,String> >::Iterator iter = img_map.Search(vec_file[i].GetSrc());
201         if(iter)
202         {
203             if(!last_name.IsEmpty())
204             {
205                 Bool found = False;
206                 RBT<String> src_map,dst_map;
207                 typedef RBT<String>::Iterator map_iter;
208                 for(RBT<Pair<String,String> >::Iterator iter=img_map.Search(last_name);iter;iter=img_map.Search((*iter).GetVal()))
209                 {
210                     map_iter it = src_map.Search((*iter).GetKey());
211                     if(it)
212                     {
213                         break;
214                     }
215                     src_map.Insert((*iter).GetKey());
216                 }
217                 for(RBT<Pair<String,String> >::Iterator iter=img_map.Search(vec_file[i].GetSrc());iter;iter=img_map.Search((*iter).GetVal()))
218                 {
219                     if(src_map.Search((*iter).GetKey()))
220                     {
221                         found = True;
222                         break;
223                     }
224                     map_iter it = dst_map.Search((*iter).GetKey());
225                     if(it)
226                     {
227                         break;
228                     }
229                     dst_map.Insert((*iter).GetKey());
230                 }
231                 if(!found)
232                 {
233                     fprintf(html,"<hr>\n");
234                 }
235             }
236             printf("%s Same with %s \n",vec_file[i].GetSrc(),(*iter).GetVal());
237             fprintf(html,"<a href='file:///%s'>%s</a><br>\n",vec_file[i].GetSrc(),vec_file[i].GetSrc());
238             has_line_draw = False;
239             last_name = vec_file[i].GetSrc();
240         }
241     }
242     fprintf(html,"</body></html>");
243     fclose(html);
244     ShellExecute(Nul,"open","output.html",Nul,Nul,SW_SHOW);
245     return 0;
246 }
247 

posted on 2009-02-04 12:06 宋振華 閱讀(3013) 評(píng)論(3)  編輯 收藏 引用

評(píng)論:
# re: 相似圖像搜索(算法) [原創(chuàng)] 2009-02-04 19:19 | Dancefire
算法上很奇怪,求每一個(gè)塊的顏色數(shù)的差。首先是無法處理經(jīng)過縮放的圖片,其次是無法處理整體調(diào)暗或調(diào)亮或者轉(zhuǎn)色的圖片,而且求的是平均值而不是常用的SSE?

為什么不考慮用離散余弦求出最顯著的特征,縮小至特定大小后,使用HSV(而不是RGB)來分通道比較并且綜合其結(jié)果呢?這樣起碼轉(zhuǎn)色、縮放、JPG按照不同質(zhì)量保存或者換圖像格式、調(diào)明暗之類的問題基本上都可以處理的。

可以看一些關(guān)于模式識(shí)別、數(shù)據(jù)挖掘和圖像處理的書,應(yīng)該對(duì)上述問題都有介紹。  回復(fù)  更多評(píng)論
  
# re: 相似圖像搜索(算法) [原創(chuàng)] 2009-02-04 20:57 | 宋震華
@Dancefire
很不錯(cuò)的建議,這個(gè)版本的原始需求的僅僅是提供相似圖像的快速搜索匹配.
另外一個(gè)目的是檢驗(yàn)基本類庫穩(wěn)定性,后續(xù)的版本可以考慮采用一些更加優(yōu)秀并且高效的算法,畢竟需要匹配的圖片數(shù)量可能隨時(shí)超過10的3次方.
分塊的目的就是為了快速篩選不相似的圖片.

縮放后的圖片可以考慮縮放M:N匹配規(guī)則,沒有考慮圖像轉(zhuǎn)換的主要原因是效率.
謝謝指點(diǎn).  回復(fù)  更多評(píng)論
  
# re: 相似圖像搜索(算法) [原創(chuàng)] 2009-02-05 22:19 | Bill Hsu
很強(qiáng)  回復(fù)  更多評(píng)論
  

只有注冊用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产一区日韩一区| 久久www免费人成看片高清| 99精品热视频只有精品10| 136国产福利精品导航网址| 国产在线日韩| 亚洲国产成人在线播放| 99亚洲伊人久久精品影院红桃| 国产精品红桃| 国产视频自拍一区| 亚洲国产中文字幕在线观看| 一卡二卡3卡四卡高清精品视频| 在线观看欧美亚洲| 99视频精品在线| 亚洲欧美在线一区| 美女精品网站| 欧美成人免费大片| 久久青青草综合| 欧美激情欧美狂野欧美精品| 亚洲第一偷拍| 中文日韩欧美| 久久天天躁狠狠躁夜夜爽蜜月| 久久久国产精品一区二区中文| 久久婷婷久久| 国产精品卡一卡二| 亚洲高清不卡一区| 午夜久久福利| 亚洲第一中文字幕在线观看| 亚洲天堂成人在线观看| 久久精品日产第一区二区三区| 免费亚洲网站| 国产情侣一区| 中文欧美在线视频| 欧美阿v一级看视频| 亚洲一区bb| 欧美精品综合| 尤物九九久久国产精品的特点| 亚洲免费av电影| 久久深夜福利免费观看| 在线综合亚洲| 欧美精品18+| 亚洲福利视频免费观看| 欧美制服丝袜| 亚洲无毛电影| 欧美三级午夜理伦三级中视频| 狠狠久久五月精品中文字幕| 亚洲与欧洲av电影| 亚洲国产一区二区在线| 久久这里只精品最新地址| 国产午夜精品视频免费不卡69堂| 亚洲免费高清| 亚洲国产成人精品久久久国产成人一区| 艳女tv在线观看国产一区| 欧美 日韩 国产在线| 国产真实乱偷精品视频免| 欧美中文字幕精品| 亚洲欧美日韩一区二区| 国产精品久久久久9999| 亚洲一区三区视频在线观看| 亚洲精品久久久久久久久久久| 亚洲女同同性videoxma| 国产精品成人在线观看| 亚洲小说欧美另类社区| 99国产精品久久久久老师| 欧美日本在线观看| 在线亚洲精品福利网址导航| 亚洲精品乱码久久久久久黑人| 久久躁日日躁aaaaxxxx| 亚洲高清色综合| 亚洲国产另类久久久精品极度| 久久综合色婷婷| 亚洲欧洲日韩在线| 亚洲精品一区久久久久久| 欧美日韩午夜剧场| 亚洲欧洲99久久| 欧美一级欧美一级在线播放| 午夜精品一区二区三区四区| 亚洲女女女同性video| 国产精品永久在线| 久久激情一区| 免费不卡在线观看av| 亚洲精品一区二区网址| 亚洲视频碰碰| 精品福利av| 日韩午夜一区| 国产性色一区二区| 欧美成人a∨高清免费观看| 欧美精品色一区二区三区| 亚洲欧美一区二区激情| 久久久女女女女999久久| 99热免费精品在线观看| 亚洲欧美日韩中文视频| 在线日韩中文字幕| av不卡在线看| 黄色另类av| 亚洲精品一区中文| 国产偷自视频区视频一区二区| 久久精品人人做人人爽电影蜜月| 久久精品国产综合精品| av成人免费在线观看| 欧美一级播放| 一区二区国产日产| 久久婷婷久久| 欧美在线电影| 欧美日韩久久精品| 麻豆久久婷婷| 国产精品青草综合久久久久99 | 欧美福利视频网站| 欧美日韩中文字幕日韩欧美| 久久亚洲国产精品日日av夜夜| 免费观看一区| 久久米奇亚洲| 国产精品国色综合久久| 亚洲国产成人av| 国产亚洲欧美日韩精品| 日韩视频在线免费观看| 亚洲黄色免费电影| 久久福利视频导航| 午夜久久久久久| 欧美日韩在线影院| 91久久久久久| 亚洲精品国产精品久久清纯直播 | 亚洲一区二区在线| 亚洲乱亚洲高清| 久久资源在线| 久久欧美中文字幕| 国产欧美日韩视频| 在线亚洲观看| 亚洲午夜一区| 欧美日韩在线不卡| 亚洲精品中文在线| 一本色道婷婷久久欧美| 欧美激情一区在线观看| 久久综合久久综合九色| 91久久国产综合久久91精品网站| 久久亚洲午夜电影| 久久久久久久久久看片| 国产精品日本一区二区| 亚洲午夜久久久久久久久电影网| 亚洲国产精品电影| 免费亚洲网站| 日韩系列在线| 亚洲欧美在线播放| 国产片一区二区| 欧美在线国产精品| 免费久久99精品国产| 亚洲欧洲另类国产综合| 欧美精品v国产精品v日韩精品| 欧美激情成人在线| 亚洲精品乱码久久久久久蜜桃麻豆 | 久久国产精品久久久| 久久久久女教师免费一区| 激情久久婷婷| 欧美www视频| 亚洲久久一区二区| 亚洲在线成人| 国产偷自视频区视频一区二区| 亚洲男人影院| 免费一级欧美片在线播放| 亚洲欧洲视频在线| 国产精品第一区| 久久精品国产一区二区三区| 欧美99在线视频观看| 亚洲免费成人av电影| 国产精品一区二区视频| 久久―日本道色综合久久| 亚洲精品免费看| 久久狠狠一本精品综合网| 亚洲福利视频免费观看| 欧美日韩另类综合| 久久aⅴ国产紧身牛仔裤| 亚洲国产精品v| 欧美在线影院| 一区二区欧美在线| 狠狠久久亚洲欧美专区| 欧美日韩国产综合一区二区| 欧美一级艳片视频免费观看| 亚洲国产美女精品久久久久∴| 日韩视频国产视频| 国产亚洲日本欧美韩国| 欧美激情一区二区三区蜜桃视频| 一区二区三区国产| 美女诱惑一区| 香蕉久久精品日日躁夜夜躁| 亚洲黄色免费网站| 国产一级一区二区| 国产精品免费久久久久久| 鲁大师成人一区二区三区| 中国亚洲黄色| 91久久综合| 美女久久一区| 久久精品99国产精品| 亚洲视频中文字幕| 亚洲老司机av| 亚洲黄色成人| 激情综合色综合久久综合| 国产精品黄色| 欧美视频在线一区二区三区| 欧美成人资源网| 免费不卡在线视频| 久久亚洲春色中文字幕|