c00WKmdje2wZLrSI
V2EX  ›  问与答

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

  •  
  •   c00WKmdje2wZLrSI · Aug 31, 2022 · 3836 views
    This topic created in 1350 days ago, the information mentioned may be changed or developed.

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

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

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

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

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

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

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

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

    当然你要是大多数都不是纯色的话,遍历应该最快
    anonymous2351d00
        25
    anonymous2351d00  
       Sep 1, 2022
    这个我熟,拉取各大 java 去掉末位 a 的网站,对比车牌号就能识别是不是纯纯的色图[狗头]。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   934 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 78ms · UTC 21:24 · PVG 05:24 · LAX 14:24 · JFK 17:24
    ♥ Do have faith in what you're doing.