gpt4 book ai didi

image - 十字绣到 Matlab

转载 作者:行者123 更新时间:2023-12-03 07:29:02 26 4
gpt4 key购买 nike

我女朋友说她可能会开始做一些Cross Stitching她可能想要画一幅画、图像或其他什么。在那一刻,我想“好吧,我应该能够创建一个 Matlab 代码来获取任何图像并将其转换为十字绣图案”。 It turns out I am not the first one to think about this.

但我不确定我做的是否正确。

让我们举个例子:

假设一个像素化图像,任何尺寸,任何调色板。例如以下来自像素艺术家 Waneella 的屏幕截图

enter image description here

假设我们不想缩放图像,结果图像将具有与原始图像相同的像素数量(否则 imresize 即可)。

现在的问题是仅使用可用调色板中的调色板。我决定使用DCM调色板,主要是因为我找到了它的RGB转换。

我创建了颜色量化。我使用 Lab 颜色在 DCM 调色板中查找最接近的颜色并使用该颜色。

clear;clc;
% read image (its a gif)
[img,C]=imread('wn.gif');
% Convert it to RGBimage.
img2=img(:,:,:,3);

imgC=zeros([size(img2) 3]);

for ii=1:size(img2,1)
for jj=1:size(img2,2)
imgC(ii,jj,:)=C(img2(ii,jj)+1,:);
end
end
img=imgC;
imshow(img)

% read DCMtoRB conversion
fid=fopen('DCMRGB.txt');
fgets(fid);
ii=0;
tline = fgets(fid);
while ischar(tline)
ii=ii+1;
table{ii}=tline;
tline = fgets(fid);
end
fclose(fid);

for ii=1:size(table,2)
DCMRGB(ii,1)=str2num(table{ii}(1:4));
DCMRGB(ii,4)=hex2dec(table{ii}(end-5:end-4));
DCMRGB(ii,3)=hex2dec(table{ii}(end-7:end-6));
DCMRGB(ii,2)=hex2dec(table{ii}(end-9:end-8));
end

% origColous=reshape(img, [], 3);
Colours=double(unique(reshape(img, [], 3), 'rows'));
Ncol=size(Colours,1);



cform = makecform('srgb2lab');
DCMLab = applycform(DCMRGB(:,2:4)./255,cform);
Colourslab = applycform(Colours,cform);


eudist=@(p)sqrt(p(:,1).^2+p(:,2).^2+p(:,3).^2);
Cind=zeros(Ncol,1);

for ii=1:Ncol
aux=ones(size(DCMLab,1),3);
aux(:,1)=Colourslab(ii,1);
aux(:,2)=Colourslab(ii,2);
aux(:,3)=Colourslab(ii,3);
d=eudist(DCMLab-aux);
[~,Cind(ii)]=min(d);
end
% now DCMRGB will have DCMcode, R, G, B
% Perform map conversion
img2=zeros(size(img));
indimg=zeros(size(img,1),size(img,2));
for ii=1:size(img,1)
for jj=1:size(img,2)
%wich colour is the pixel?
[~,indx]=ismember(double(squeeze(img(ii,jj,:)))',Colours,'rows');
indimg(ii,jj)=Cind(indx);
img2(ii,jj,:)=DCMRGB(Cind(indx),2:4);
end
end


%%
subplot(121)
imshow((img))
% subplot(222)
% [X_dither,map]=rgb2ind(img,DCMRGB(:,2:4)./255,'nodither');
% imshow(uint16(X_dither),map);

subplot(122)
imshow(double(img2)./255)

结果如下:

enter image description here但是,在此网页中:http://www.picturecraftwork.com/正如你所看到的,网页中颜色的选择是不同的,实际上它更有意义,即使没有真实的颜色图也给人一种很好的感觉。

经过多次思考,我相信可能有两件事我需要改变和实现。

1.- 我不 100% 相信 DCMRGB 值。我给该公司发了电子邮件,寻求有关他们调色板的更多信息。

2.- 亮度、对比度、色调和饱和度值对输出有巨大影响。

如何使用 Matlab 修改所需图像中的这 4 个值(如网页中所示)?

<小时/><小时/>

DMC2RGB 文件:(如果需要,我可以将其复制粘贴到此处)

http://pastebin.com/qixUgnvy

DCM 调色板:

enter image description here

最佳答案

好吧,这是一个概括性的建议,尽管我还没有取得很好的结果。

1) 首先使用 rgb2indnodither 将原始图像减少为合理的颜色数量,仅指定颜色数量(而不是使用的贴图)。

[I_ind, old_map] = rgb2ind(I,64,'nodither);

您可以尝试适合给定图像的颜色数量,而不会丢失太多细节。基本上,您首先要弄清楚需要多少种独特的颜色(当您十字绣输出时,您不想要一堆仅用于每种大约三针的颜色)。

2) 将两张贴图(rgb2ind 的输出贴图和从 dcm 加载到 rgb 文件的贴图)转换为适当的色彩空间(我使用 HSV,因为我感觉很懒) ,L*a*b 可能更好)。

3) 通过检查哪些索引颜色具有最多的像素来选择颜色,选择最接近的颜色,然后从候选列表中删除该颜色,这样我们最终会得到 64 或其他颜色

% use histogram and sorting - assign colours to most common values first
[plist pbins] = hist(I_ind(:),0:63);
[plist_sorted, sort_ind] = sort(plist, 'descend');

% old_map = the output of rbg2ind
% new_map = the new one we're about to make
% dcm_map = (copy of!) the dcm map in the same colorspace
new_map = zeros(size(old_map));

% loop through from most to least common, remove a colour from the dcm map if we've used it.
for n = 1:sort_ind
D = pdist2(old_map(n,:),dcm_map);
m = find(D==min(D),1,'first');
new_map(n,:) = dcm_map(m,:);
dcm_map(m,:) = [];
end

我使用了你在这个问题上使用过的图片。因为它来自 rgb2ind:

pixel image with 64 colors

最终它有 64 种 DCM 颜色(有点偏差,可能是因为我的比较选择是错误的,但保证有 64 种单独的 DCM 颜色)。

pixel image with 64 dcm colors

我想您需要找到的是不同因素的正确权重(您可以轻松地将权重函数放入 pdist2 中)。例如,将 HSV 加权为 [0.8, 0.1, 0.1] 给了我这个辉煌的疯狂:

enter image description here

关于image - 十字绣到 Matlab,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27253260/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com