zoukankan      html  css  js  c++  java
  • Matlab 对图片的二值化处理

      这几天做了一道题目,要求在 5000 张图片中找出 30 张与样例相同但经过放大或缩小,高亮或变暗的图片。

      整体思路是把图片hash成一段指纹,这个指纹和图片的大小、格式、明暗均无关,只和图片的内容本身有关。

      1.先把彩色图片转为灰度图

      如果原本的一个像素点的rgb值为(r1,g1,b1),一个比较简易的方法转为灰度图,

      就是 gray1=(r1*299+g1*587+b1*114+500)/1000

      那么该像素点的rgb颜色变为(gray1,gray1,gray1)。

      而我用的是 Matlab 中的函数 imgray = rgb2gray(imdata);

      2.将灰度图转化为黑白图

      先计算出该图的平均灰度,一种比较简易的做法是把所有像素点的灰度求和平均。 然后对于每个像素点,如果小于平均灰度,则rgb值为(0,0,0),否则为(255,255,255)。

      经过这一步,图片就变成黑白的了。我用的是 Matlab 中函数 lev = graythresh( imdata); 求平均灰度,再 bwimg = im2bw( imdata, lev); 求二值图。

      但这样的函数对于一些高亮或灰暗的图片的处理不是特别的好,会使整个图片呈现全白或全黑的现象。

      我对于这些图片的处理是 自己设定 lev,根据需要设 lev 为 0~1 的值,而不是求图片的平均值。(找到更好的方法再来更新)。

      4 编码

      将之前的二值图放大或缩小为 8*8 的一个矩阵 imdata = imresize(imdata, [8,8]);

          

      白为 0,黑为 1 整合成 1 个 64 位的二进制, 转化为 16 进制则是这个图片的指纹了。

      在这里,我并没有转换成 16 进制进行比较,而是直接对二进制串做的对比,完全相同的并不多,所以不同的字符在十个之内我都算成相似的,再进行进一步的比较。

    转载请注明出处:http://www.cnblogs.com/ygdblogs
  • 相关阅读:
    北京积分落户
    HDU-1054-Strategic Game
    POJ-3020-Antena Placement(最小路径覆盖)
    HDU-4185-Oil Skimming(最大匹配)
    HDU-2389-Rain on your Parade (最大匹配,kopcroft-karp)
    HDU-1083-Courses(最大匹配)
    HDU-1045-Fire Net(最大匹配)
    HDU-2444-The Accomodation of Students(二分图判定,最大匹配)
    Codeforces Round #569 (Div. 2) C. Valeriy and Deque
    Codeforces Round #569 (Div. 2) B. Nick and Array
  • 原文地址:https://www.cnblogs.com/ygdblogs/p/5071165.html
Copyright © 2011-2022 走看看