Wan*_*ong 7 matlab opencv image-processing computer-vision k-means
人眼很容易从其他颜色中辨别出黑色.但电脑怎么样?
我在普通A4纸上打印了一些色块.由于有三种墨水组成彩色图像,青色,品红色和黄色,我设置每个块的颜色C = 20%,C = 30%,C = 40%,C = 50%,其余两种颜色这是我的源图像的第一列.到目前为止,没有黑色(CM of CMYK)墨水打印.之后,我设置每个点的颜色K = 100%,其余颜色为0以打印黑点.

你可能会觉得我的形象很奇怪而且可怕.实际上,图像放大30倍,可以清楚地看到墨水欺骗我们的眼睛.色条妨碍我识别这些黑点(点打印为800 dpi的一个像素).没有颜色背景,我习惯blur并且做canny edge detector了提取边缘.然而,当添加颜色背景时,由于条带,简单地做grayscale并且edge detector不能获得好的结果.为了解决这些问题,我的眼睛会怎样做?
我决定检查源图像的亮度.我参考了这篇文章和公式:
亮度= sqrt(0.299 R*R + 0.587 G*G + 0.114 B*B)

亮度更接近人类的感知,并且在黄色背景下效果非常好,因为与青色和品红色相比,黄色的亮度最高.但如何使青色和洋红色条带尽可能明亮?预期的结果是所有条带都消失了.
更复杂的图像:
C = 40%,M = 40%

C = 40%,Y = 40%

Y = 40%,M = 40%

FFT结果为C = 40%,Y = 40%亮度图像

任何人都可以给我一些提示去除色条?
@natan我试过你建议我的FFT方法,但我不幸在轴x和y都达到峰值.为了像你一样绘制频率,我将图像调整为正方形.


检查图像后,我认为稳健的阈值比任何东西都更简单。例如,查看 C=40%、M=40% 的照片,我首先反转强度,这样黑色(信号)就会变成白色,只需使用
im=(abs(255-im));
Run Code Online (Sandbox Code Playgroud)
我们可以使用以下命令检查它的 RGB 直方图:
hist(reshape(single(im),[],3),min(single(im(:))):max(single(im(:))));
colormap([1 0 0; 0 1 0; 0 0 1]);
Run Code Online (Sandbox Code Playgroud)

所以我们看到,对一些中等强度有很大的贡献,而现在是白色的“信号”大部分被分离到更高的值。然后我应用了一个简单的阈值,如下所示:
thr = @(d) (max([min(max(d,[],1)) min(max(d,[],2))])) ;
for n=1:size(im,3)
imt(:,:,n)=im(:,:,n).*uint8(im(:,:,n)>1.1*thr(im(:,:,n)));
end
imt=rgb2gray(imt);
Run Code Online (Sandbox Code Playgroud)
并摆脱了小于某些典型区域尺寸的物体
min_dot_area=20;
bw=bwareaopen(imt>0,min_dot_area);
imagesc(bw);
colormap(flipud(bone));
Run Code Online (Sandbox Code Playgroud)
这是结果和原始图像:

这个阈值的起源来自于我编写的这段代码,该代码假设噪声背景中的稀疏信号以二维峰值或斑点的形式存在。我所说的稀疏是指没有堆积的山峰。在这种情况下,当在 x 或 y 轴上投影 max(image) 时(通过(max(im,[],1)或 ),(max(im,[],1)您可以很好地测量背景。这是因为您采用了max(im)矢量的最小强度。
如果您想以不同的方式看待这一点,您可以查看图像强度的直方图。背景应该是围绕某个强度的某种正态分布,信号应该高于该强度,但出现的次数要少得多。通过查找 max(im)其中一个轴(x 或 y),您可以发现最大噪声水平是多少。
您会看到阈值在直方图中选择了该点,该点上方仍然有一些噪声,但所有信号也都在该点上方。这就是为什么我将其调整为1.1*thr. 最后,有很多更奇特的方法来获得稳健的阈值,这是一种快速而肮脏的方法,在我看来已经足够好了......
| 归档时间: |
|
| 查看次数: |
3629 次 |
| 最近记录: |