Léo*_* 준영 9 matlab resolution image image-processing
有RGB和Parula之间没有一一对应,讨论在这里.我在想如何做好Parula中文件的图像处理.通过将案例扩展到Parula颜色的广义问题,从这个线索开发了关于从ECG图像中去除黑色的挑战.
数据:
这是由...生成的
[X,Y,Z] = peaks(25);
imgParula = surf(X,Y,Z);
view(2);
axis off;
Run Code Online (Sandbox Code Playgroud)
在您的解决方案中使用此代码来读取第二个图像不是此线程的重点.
码:
[imgParula, map, alpha] = imread('http://i.stack.imgur.com/tVMO2.png');
Run Code Online (Sandbox Code Playgroud)
其中map
是[]
与alpha
是全白图像.做的imshow(imgParula)
给
你看到很多干扰和分辨率丢失,因为Matlab将图像读取为RGB,尽管实际的色彩图是Parula
.调整此图片大小不会提高分辨率.
如何在Matlab中将图像读入相应的色彩映射? 我没有找到任何参数来指定阅读中的色彩映射.
问题
有一个一对一的映射从索引颜色在parula
颜色映射到RGB三元组.但是,没有这样的一对一映射来反转此过程以将parula
索引颜色转换回RGB(实际上有无数种方法可以这样做).因此,两个空间之间没有一对一的对应关系或双向关系.下面的图显示了每个parula
索引的R,G和B值,这使得它更清晰.
大多数索引颜色都是这种情况.这个问题的任何解决方案都是非唯一的.
内置解决方案
我稍微玩了一下后,我意识到已经有一个内置函数可能就足够了:rgb2ind
它将RGB图像数据转换为索引图像数据.该函数使用dither
(进而调用mex函数ditherc
)来执行逆色图转换.
这是一个使用JPEG压缩来增加噪声并扭曲原始parula
索引数据中颜色的演示:
img0 = peaks(32); % Generate sample data
img0 = img0-min(img0(:));
img0 = floor(255*img0./max(img0(:))); % Convert to 0-255
fname = [tempname '.jpg']; % Save file in temp directory
map = parula(256); % Parula colormap
imwrite(img0,map,fname,'Quality',50); % Write data to compressed JPEG
img1 = imread(fname); % Read RGB JPEG file data
img2 = rgb2ind(img1,map,'nodither'); % Convert RGB data to parula colormap
figure;
image(img0); % Original indexed data
colormap(map);
axis image;
figure;
image(img1); % RGB JPEG file data
axis image;
figure;
image(img2); % rgb2ind indexed image data
colormap(map);
axis image;
Run Code Online (Sandbox Code Playgroud)
这应该产生类似于前三个的图像.
替代解决方案:色差
完成此任务的另一种方法是通过比较RGB图像中的颜色与对应于每个颜色图索引的RGB值之间的差异.要做到这一点的标准方法是通过计算Δ Ë在CIE的L*a*b*表色空间.我已经在一个通用函数中实现了这种形式rgb2map
,可以从我的GitHub下载.此代码依赖于图像处理工具箱,makecform
并applycform
在RGB中转换为1976 CIE L*a*b*颜色空间.
以下代码将生成如右上图所示的图像:
img3 = rgb2map(img1,map);
figure;
image(img3); % rgb2map indexed image data
colormap(map);
axis image;
Run Code Online (Sandbox Code Playgroud)
对于输入图像中的每个RGB像素,rgb2map
使用CIE 1976标准计算输入色彩映射中的每个RGB三元组之间的色差.该min
函数用于查找最小ΔE的索引(如果存在多于一个最小值,则返回第一个的索引).在多个ΔE最小值的情况下,可以使用更复杂的手段来选择"最佳"颜色,但是它们将更昂贵.
结论
作为最后一个例子,我使用同名Parula鸟的图像来比较下图中的两种方法.这个图像的两个结果完全不同.如果您手动调整rgb2map
以使用更复杂的CIE 1994色差标准,您将获得另一个渲染.但是,对于与原始parula
色彩图更紧密匹配的图像(如上所述),两者都应返回更相似的结果.重要的是,rgb2ind
调用mex函数带来的好处几乎要快100倍,rgb2map
尽管我的代码中进行了多次优化(如果使用CIE 1994标准,它的速度大约快700倍).
最后,那些想要在Matlab中学习更多关于色彩映射的人,应该阅读Steve Eddins关于新色彩图的四部分MathWorks博客文章parula
.
更新2015年6月20日: rgb2map
上面描述的代码更新为使用不同的颜色空间变换,这使其速度提高了近两倍.