V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
c00WKmdje2wZLrSI
V2EX  ›  问与答

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

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

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

    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  
       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  
       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   ·   实用小工具   ·   2740 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 09:00 · PVG 17:00 · LAX 01:00 · JFK 04:00
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.