Java 该如何判断一张图片是否是纯色的图片呢? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
c00WKmdje2wZLrSI
V2EX    问与答

Java 该如何判断一张图片是否是纯色的图片呢?

  •  
  •   c00Wmdje2wZLrSI 2022-08-31 16:55:52 +08:00 3393 次点击
    这是一个创建于 1144 天前的主题,其中的信息可能已经有所发展或是发生改变。

    除了每个像素循环判断过去,还有什么快一些的办法吗?

    25 条回复    2022-09-01 17:16:29 +08:00
    Jooooooooo
        1
    Jooooooooo  
       2022-08-31 16:56:42 +08:00   1
    纯色什么定义?
    murmur
        2
    murmur  
       2022-08-31 17:02:26 +08:00
    搜了一下,方法大多是使用 c 库缩放图片到小尺寸,比如 16*16 ,这样肯定有误差,但是总比对着几 k 分辨率图片遍历性能要好
    AoEiuV020CN
        3
    AoEiuV020CN  
       2022-08-31 17:06:16 +08:00
    对计算机来说,没有比遍历更高效准确的了,
    可以牺牲准确的话直接在遍历的时候选择性跳过一些就是了,
    villivateur
        4
    villivateur  
       2022-08-31 17:10:46 +08:00
    如果是用通用 CPU 去计算,肯定只能遍历。
    当然你可以想象其他办法,比如用 GPU 加速,或者用 FPGA 专门写个用于判断图片纯色的方案。
    ipwx
        5
    ipwx  
       2022-08-31 17:25:05 +08:00   2
    @murmur 奇怪,Java 不是能做到和 C/C++ 性能差不多嘛。

    缩放还要做平均,理论上直接遍历更快才对啊
    jdhao
        7
    jdhao  
       2022-08-31 17:33:33 +08:00 via Android   1
    理论上不遍历,你不可能确定,另外需要考虑是否需要像素值完全一样,还是感官上一样,例如 (255,255,255) 和 (255, 254, 255) 是否一样?
    paramagnetic
        8
    paramagnetic  
       2022-08-31 17:41:30 +08:00 via iPhone
    对图片做 FFT 然后检查是否只有 DC 分量( doge )
    LeegoYih
        9
    LeegoYih  
       2022-08-31 17:58:57 +08:00   2
    1. 如果图片大部分不是纯色的,那么遍历是最快的
    2. 允许小概率出现错误,采样就行,随机取 30%的像素点判断
    3. 外包给印度人,肉眼判断
    cpstar
        10
    cpstar  
       2022-08-31 18:09:12 +08:00
    利用压缩?特别是摘要压缩?
    xtreme1
        11
    xtreme1  
       2022-08-31 18:13:51 +08:00
    @ipwx 这种大量小对象的情况就是 native 语言的核心阵地, java 多一个 12 bytes 的 header, 很多时候就决定了内循环能不能放进 L1.
    z1113456051
        12
    z1113456051  
       2022-08-31 18:14:19 +08:00
    先按段或者求余分 n 组,比较每组的第 m 个都相同。
    murmur
        13
    murmur  
       2022-08-31 18:20:02 +08:00
    @ipwx 这个命题的回答者应该默认 java 开发者没有高深的内存管理能力,而且用的库对内存和 cpu 指令集有优化吧

    要不提这个问题的早就自己去实践了,干嘛去提问。。
    lakehylia
        14
    lakehylia  
      &nsp;2022-08-31 18:23:19 +08:00
    判断所有点是否聚集,不是用方差吗?
    lakehylia
        15
    lakehylia  
       2022-08-31 18:29:40 +08:00
    回忆了下,这不就是聚类算法嘛。。。
    wasd6267016
        16
    wasd6267016  
       2022-08-31 18:49:22 +08:00
    准确算法的话无论如何都要遍历吧 少读一个像素都不行
    XuHuan1025
        17
    XuHuan1025  
       2022-08-31 18:50:34 +08:00
    .isBlank
    TimePPT
        18
    TimePPT  
    PRO
       2022-08-31 19:57:59 +08:00
    搞几百张你认为的纯色图片,直接训个二分类器就行。
    fox0001
        19
    fox0001  
       2022-08-31 23:55:55 +08:00 via Android
    1 )图片都是位图吗?有没有矢量图?

    2 )回复里都提到,纯色是怎样定义?要不要考虑色差范围?

    3 )如果纯色的定义是每一个像素的颜色值都相同,那只能逐个像素遍历。正如 16 楼所言。

    4 )文件处理,不是 Java 的强项。好像 stream 针对这种情况的遍历优化过,但也不会快太多。并发处理的话,理论上更快。这方面我缺乏经验,也不能给太多详细建议。
    TimPeake
        20
    TimPeake  
       2022-09-01 00:03:12 +08:00
    随机取 N 次 个点坐标色值?如果相同则是纯色 哈哈
    icyalala
        21
    icyalala  
       2022-09-01 00:08:02 +08:00
    如果是位图,那无论如何都要遍历所有像素。上面说的什么缩小、压缩,同样也是遍历。
    优化点无非是比如用 simd 加速一下,我觉得够快了。

    如果是特定的压缩格式,比如 png 带调色板的,那直接根据压缩方式查一下肯定最快。
    pennai
        22
    pennai  
       2022-09-01 00:13:08 +08:00
    压缩操作本身就需要遍历,抛开前置条件谈没有意义啊
    jifengg
        23
    jifengg  
       2022-09-01 09:02:47 +08:00
    如果是要判断完全一致的纯色,个人觉得除了遍历没有其他办法了。
    遍历的话,可以根据实际场景优化,比如从四个角往中心,或者反着来,就是尽早遇到不一样的颜色,退出遍历。
    bibitiger
        24
    bibitiger  
       2022-09-01 16:10:51 +08:00
    切片,多线程
    比较换成位运算

    当然你要是大多数都不是纯色的话,遍历应该最快
    anonymous2351d00
        25
    anonymous2351d00  
       2022-09-01 17:16:29 +08:00
    这个我熟,拉取各大 java 去掉末位 a 的网站,对比车牌号就能识别是不是纯纯的色图[狗头]。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     2424 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 25ms UTC 15:42 PVG 23:42 LAX 08:42 JFK 11:42
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86