相关疑难解决方法(0)

如何将位图缩小为一组已知的RGB颜色

对于一个业余爱好项目,我将构建一个程序,当给定图像位图时,将创建一个十字绣图案作为PDF.我将在Mac上使用Cocoa/Objective C.

源位图通常是24bpp图像,但是在数百万种可用颜色中,只有少数存在作为十字绣线程.线程有各种类型.DMC是最广泛使用的,几乎整个范围都可以从各种网站获得RGB值.例如,这是一个.

DMC#  Name               R   G   B
----- ------------------ --- --- ---
blanc White              255 255 255
208   Lavender - vy dk   148  91 128
209   Lavender - dk      206 148 186
210   Lavender - md      236 207 225
211   Lavender - lt      243 218 228
      ...etc...
Run Code Online (Sandbox Code Playgroud)

正如我所看到的,我的第一个问题是从RGB的起点开始,从图像中的像素中选择DMC集中可用的最近颜色.在数学上找到最接近的DMC颜色的最佳方法是什么,并确保它也适合作为颜色?

虽然我将使用Cocoa,但您可以在发布的任何代码中使用伪代码(甚至是Java!).

rgb bitmap image-processing

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

许多图像及其调色板的算法

对于一个项目,我正在寻找一种算法,将大量图像转换为调色板图像,这些图像可以共享相同的调色板.


短篇小说

鉴于:

  • 图像列表(RGB),已经具有应该使用的最终颜色.

结果:

  • 图像列表(显示)
  • 调色板列表
  • 通过使用不同的调色板,可以将多个RGB图像转换为一个指示图像.
  • 我想使用所需的最少量调色板所需的最少量图像.

限制:

  • 最多有n个调色板
  • 每个调色板最多有m种颜色
  • 最多可以在结果中生成u图像

我的问题是什么:

  • 我不知道如何构建算法,因此它可以决定先前的决定是否对未来的问题是错误的.(见下文)
  • 我不知道如何解决重新排列调色板颜色和图像数据,因为重新排列一个图像数据可能会导致重新排列的后续问题,这可能会在无休止的重新排列战中结束:D(见下文)

这是完整的故事

结果

因此,这应该是结果:在这种情况下,一个颜色索引表(也称为指示图像)使用两个不同的调色板生成两个不同的RGB图像.

图像渲染过程

第一步

由于输入文件都是RGB图像,我们需要先将它们转换为具有匹配颜色索引的调色板.

在下图中,您可以看到算法如何开始使用前三个图像:

  1. 它们转换调色板颜色索引
  2. 检查两个图像是否共享相同的颜色索引,如果是这样,我们可以重用颜色索引但创建一个调色板(不是必需的!)
  3. 否则,我们可以四种新颜色添加到第一个调色板创建一个新的颜色索引.(此图中未显示)
  4. 对于第三个图像,我们找到了一个已包含所有必需颜色的调色板,因此我们决定重复使用调色板,但重新排列我们的颜色索引以匹配现有调色板.

我们算法的第一步

让我们变得复杂!

到现在为止还挺好.但是我们应该如何继续使用最后一张图片呢?它可以共享前一个的颜色索引,但它与任何现有的调色板都不匹配.实际上它与任何现有的调色板都不匹配.

因此下图描述了实际问题:如何确定最适合图像的内容?创建一个新的调色板,创建一个新的颜色索引,如果我们过去另有决定,一切都会好的怎么办?我们怎么知道?

问题

重新排列

那么,这四个图像仍然是简单的情况.让我们假设算法已经处理了很多图像,并生成了一个调色板.我们的input-image-list中的下一个图像找到一个匹配的调色板,因此它可以很容易地创建新的颜色索引并且没问题.但是:结果应该是最少的图像和调色板,所以可能有另一种方式!

通过检查所有先前的图像,我们发现,我们可以使用前一图像的现有调色板和 …

javascript sorting algorithm image colors

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

有效的gif /图像颜色量化?

所以我试图在我的Java应用程序中编码一些动画gif文件.我一直在使用在线发现的一些类/算法,但似乎没有一个工作得很好.

现在我正在使用这个量化类将图像的颜色减少到256:http://www.java2s.com/Code/Java/2D-Graphics-GUI/Anefficientcolorquantizationalgorithm.htm

问题是,它似乎并不是非常"聪明".

如果我传入的图像超过256种颜色,它确实会减少颜色数,但效果不是很好.(红色变成蓝色等 - 非常明显的错误就像这样).

您可以推荐使用Java中的颜色量化的其他算法/库吗?


注意:我知道在此算法中使用的Neuquant:http://www.java2s.com/Code/Java/2D-Graphics-GUI/AnimatedGifEncoder.htm

它非常慢并产生"eh"结果(帧之间的颜色闪烁).

java algorithm gif animated-gif quantization

5
推荐指数
2
解决办法
3305
查看次数

保存为 GIF 后图像质量下降

我正在开发一款 iOS 应用程序,它允许用户拍摄一系列照片 - 然后将照片放入动画中并导出为 MP4 和 GIF。

虽然 MP4 呈现源质量,但 GIF 颜色等级是可见的。

这是视觉比较:

动图:动图

MP4MP4

我用于导出为 GIF 的代码:

var dictFile = new NSMutableDictionary();
        var gifDictionaryFile = new NSMutableDictionary();
        gifDictionaryFile.Add(ImageIO.CGImageProperties.GIFLoopCount, NSNumber.FromFloat(0));

        dictFile.Add(ImageIO.CGImageProperties.GIFDictionary, gifDictionaryFile);

        var dictFrame = new NSMutableDictionary();
        var gifDictionaryFrame = new NSMutableDictionary();
        gifDictionaryFrame.Add(ImageIO.CGImageProperties.GIFDelayTime, NSNumber.FromFloat(0f));

        dictFrame.Add(ImageIO.CGImageProperties.GIFDictionary, gifDictionaryFrame);


        InvokeOnMainThread(() =>
    {
        var imageDestination = CGImageDestination.Create(fileURL, MobileCoreServices.UTType.GIF, _images.Length);

        imageDestination.SetProperties(dictFile);

        for (int i = 0; i < this._images.Length; i++)
        {
            imageDestination.AddImage(this._images[i].CGImage, dictFrame);

        }
        imageDestination.Close();
    });
Run Code Online (Sandbox Code Playgroud)

我用于导出为 MP4 的代码:

var videoSettings = new NSMutableDictionary(); …
Run Code Online (Sandbox Code Playgroud)

image-processing gif ios swift

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

如何将RGB直方图转换为色谱?

如何转换图像的RGB直方图以创建显示组合颜色以及正确颜色波长范围的直方图?

示例代码:

pkg load image
f=imread('/tmp/marbles.jpg');
f=uint8(f); %need to convert back to uint8 to show picture

%Split into RGB Channels
f_red = f(:,:,1);
f_green = f(:,:,2);
f_blue = f(:,:,3);

%Get histValues for each channel
[y_f_red, x] = imhist(f_red);
[y_f_green, x] = imhist(f_green);
[y_f_blue, x] = imhist(f_blue);
subplot (2,1,1); imshow(f);
subplot (2,1,2); plot(x, y_f_red, 'r', x, y_f_green, 'g', x, y_f_blue, 'b');
Run Code Online (Sandbox Code Playgroud)

示例图像以及代码生成的单独RGB直方图:

当前直方图

我试图让直方图看起来像下面的图像,但颜色从红色变为蓝色:

在此输入图像描述

另一个图片示例:

我想要的直方图

PS:我使用的Octave 4.0与MATLAB非常相似.

matlab image-processing histogram octave matlab-figure

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