对于一个业余爱好项目,我将构建一个程序,当给定图像位图时,将创建一个十字绣图案作为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图像.
由于输入文件都是RGB图像,我们需要先将它们转换为具有匹配颜色索引的调色板.
在下图中,您可以看到算法如何开始使用前三个图像:
到现在为止还挺好.但是我们应该如何继续使用最后一张图片呢?它可以共享前一个的颜色索引,但它与任何现有的调色板都不匹配.实际上它与任何现有的调色板都不匹配.
因此下图描述了实际问题:如何确定最适合图像的内容?创建一个新的调色板,创建一个新的颜色索引,如果我们过去另有决定,一切都会好的怎么办?我们怎么知道?
那么,这四个图像仍然是简单的情况.让我们假设算法已经处理了很多图像,并生成了一个调色板.我们的input-image-list中的下一个图像找到一个匹配的调色板,因此它可以很容易地创建新的颜色索引并且没问题.但是:结果应该是最少的图像和调色板,所以可能有另一种方式!
通过检查所有先前的图像,我们发现,我们可以使用前一图像的现有调色板和 …
所以我试图在我的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"结果(帧之间的颜色闪烁).
我正在开发一款 iOS 应用程序,它允许用户拍摄一系列照片 - 然后将照片放入动画中并导出为 MP4 和 GIF。
虽然 MP4 呈现源质量,但 GIF 颜色等级是可见的。
这是视觉比较:
动图:
MP4
我用于导出为 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) 如何转换图像的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非常相似.