小编G. *_*ach的帖子

改变rgba颜色的色调

我正在使用RGBA颜色在matplotlib中绘制一组数据作为散点图(仅在介质相关的情况下).我想要做的是,一旦我绘制了所有内容,我想挑选出单独的散点并将其色调更改为某些RGB颜色的色调,但保留旧的alpha值.我目前这样做的方式是:

oldHSV = rgb_to_hsv(oldRGBA[:3])
newHSV = rgb_to_hsv(newRGB)
oldHSV[0] = newHSV[0]
newRGBA = hsv_to_rgb(oldHSV).tolist() + [oldRGBA[3]]
Run Code Online (Sandbox Code Playgroud)

即我取旧旧RGBA值的RGB部分,将其转换为HSV,对新的RGB颜色执行相同操作,然后替换色调,将其转回RGB并添加旧的alpha值.

由于我这样做了数千次,这可能比我想在这里花费的时间长得多.一个可能的解决方案是深入研究RGB和HSV之间的转换,并一劳永逸地弄清楚如何做到这一点,但我希望知道如何处理颜色的人(我真的没有)已经想出简单有效这样做的方法.

如何在保留A的alpha值的同时将给定RGBA颜色A的色调更改为给定RGB颜色B的色调?使用不同的颜色模型(例如HSL)会简化任务,如果是这样,哪个会有帮助?

colors matplotlib

12
推荐指数
1
解决办法
1379
查看次数

在Java中识别具有相同内容的图像

不久之前,我花了一些时间寻找方法来确定两个图像是否相同才能回答这个问题.我现在面临一个稍微不同的问题:我手边有大约两千张图像,其中一些具有相同的内容,但是彼此的缩放/旋转版本(旋转总是90°的倍数),以及不同的压缩和图像格式(主要是jpg,一些png,没有别的).缩放比例不超过大约2:1.我想做的是消除重复,同时保留最高质量的实例.由于Java是我非常熟练的唯一语言,我需要使用Java.

这些问题的答案,以一个不同的问题提供了许多有用的链接,但它并不像它们之间的任何可识别重复缩放/旋转时.

这个问题以及答案建议首先将所有图像缩放到非常小的尺寸(例如32*32或16*16),然后基本上进行一些散列,并基于散列进行比较.这对我来说听起来很聪明,图像可以在比较之前进行预先排序,这将在排序之后成为O(n)问题.但是,鉴于图像可能会旋转,我不知道如何处理它; 一种选择是手动浏览所有图像并决定旋转,因为它们所描绘的具有明确的方向(人眼可以非常容易地决定"向上"应该是哪种方式).如果可能的话,我想避免这样做.

是否有既定的方法/算法(链接提到SSIM)来处理这类问题,或者你们中的任何一个能提出比上述更好的方法吗?也许有人知道适合Java的Java库(在链接的问题中提到了OpenCV的Java包装器,然后是ImageJ,imgsclr)?任何帮助表示赞赏.

java comparison image

10
推荐指数
1
解决办法
2097
查看次数

在O(1)中使用getKey(B)的一对一映射数据结构(A,B)?

这个问题最初是错误的,请参阅下面的编辑.我会把它留给上下文.

我一直在考虑建立双向(即一对一)映射的智能方法.映射函数A-> B(多对一)基本上是HashMap(A,B)的作用.如果我现在想要一个与O(1)中的contains()实现一对一的数据结构,那么我可以使用java标准库中的某些东西吗?请注意,我现在不需要这个,这只是我最近想到的,无法提供数据结构,所以答案并不急.有类似的课吗?如果没有,您认为为什么会这样?

我所能找到的就是关于冬眠的事情,这对我没有任何帮助.

编辑:我的问题是措辞不好,所以一些解释是应该的.

我的意思是"向后"映射B-> A. HashMap(A,B)在O(1)中包含(A)和包含(B),所以这甚至不是我的意思,对于混淆感到抱歉.我的意思是,是否有一个数据结构映射A < - > B在O(1)中有getValue(A)和getKey(B)?

我意识到这可以通过维护包含相同关系的两个HashMaps(A,B)和(B,A)来完成,但我觉得应该有一个数据结构来处理它而不必"手动"执行.

java contains one-to-one

8
推荐指数
2
解决办法
8940
查看次数

Java批注:在变量初始化时,而不是赋值时?

我一直在理解必须在哪里或可以放置注释的确切位置上遇到麻烦。

带有该方法的类可以编译,但会发出“未选中”警告:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();
    B cloneBoard;
    cloneBoard = (B) board.clone(); //unchecked
}
Run Code Online (Sandbox Code Playgroud)

编译时没有警告:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();

    @SuppressWarnings("unchecked")
    B cloneBoard = (B) board.clone();
}
Run Code Online (Sandbox Code Playgroud)

这不会编译,但会将cloneBoard标记为错误:

<B extends BitSet> void doStuff(LinkedList<B> list) {
    B board = list.getFirst();
    B cloneBoard;

    @SuppressWarnings("unchecked")
    cloneBoard = (B) board.clone(); // cloneBoard cannot be resolved to a type;
                                    // VariableDeclaratorID expected
}
Run Code Online (Sandbox Code Playgroud)

在有关注解的Sun教程中,我找不到关于为什么这样做的答案:http : //docs.oracle.com/javase/tutorial/java/javaOO/annotations.html

语法定义也没有帮助我,因为我不确定我是否正确理解它:http : //java.sun.com/docs/books/jls/third_edition/html/syntax.html#18.1 …

java syntax annotations

5
推荐指数
1
解决办法
1062
查看次数

Java - 许多对Math.random()的调用搞乱了循环

我有以下方法:

public LinkedList<Object> init(int counter) {
    LinkedList<Object> list = new LinkedList<Object>();
    double decision, value, key;
    int max1 = 700;
    int max2 = 1000;

    for (int i = 0; i < counter; i++) {
        decision= Math.random();

        if (decision<= 0.2) {
            key = Math.random() * 1.5;
            value= Math.random() * max1 ;
            list.add(new A(value, key));
        } else {
            value= Math.random() * max2 ;
            list.add(new B(value));
        }
     }

     return list;
}
Run Code Online (Sandbox Code Playgroud)

我得到的问题是:如果我使用这个方法

init(100);
Run Code Online (Sandbox Code Playgroud)

然后检查结果列表的大小,并非总是如此100.相反,列表中元素的数量取决于我选择的值max1max2.max2 = 1000000例如,如果我选择,我最终得到一个大约15个元素的列表.我怀疑这与 …

java random

1
推荐指数
1
解决办法
333
查看次数

从具有非均匀分布的集合中选择随机元素?

我想有一个集合,并且它的元素具有与它们相关联的概率,所以当我从集合中随机选择一个元素时,分布遵循与元素相关联的概率.我想在一个非常小的Java应用程序中使用它,它存储了我想要观看的电影列表,所以我可以给它建议一个随机电影(我总是需要几个小时才能选择一部电影).对于每部电影,我想将电影的建议次数与我联系起来,这与从下一个建议的列表中挑选电影的概率成反比.

是否有一种数据结构允许随机选择具有非均匀分布的元素?

如果没有,那么编写这样一个数据结构的最有效方法是什么?我当然总是可以构建一个数组,将列表中的每个元素放入数组中,这样数组中的值分布就可以匹配我希望它们具有的概率,并从该数组中选择一个随机元素.但是对于大型电影来说,这将是非常低效的.我的另一个想法是封装元素和所有元素的概率之和(因此第一个元素将被封装为(第一个,p(第一个)),第二个元素被封装为(第二个,第二个,p(第二个)+ p(首先))等等,然后选择一个介于0和1之间的随机数,并在这些封装元素的排序列表上进行二进制搜索.这听起来合情合理吗?

TL:DR(有点抽象):如何在Java中有效地将非均匀分布映射到集合的元素?

java random set data-structures

1
推荐指数
1
解决办法
1366
查看次数