<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />如何识别 .jpeg 图片上具有非常相似颜色(例如灰色)的像素组?
我想你可以采取几种不同的方法来解决这个问题。 我的一个问题是,您是否正在寻找一种特定的颜色(例如灰色),或者您是否正在寻找对于任何给定的像素,该像素颜色是否(紧密)与周围的像素匹配? 我认为您正在询问第一种情况,即搜索一种“目标”颜色。 另一个问题是你是否总是在寻找灰色,或者目标颜色会改变。 我问的原因是因为颜色由红、绿、蓝三种成分组成。 但是你可以将 rgb 转换为灰度图像,然后你就只有一个组件,这将使代码更简单。 我假设您正在处理彩色图像,寻找非灰色。 如果不是这种情况,您可以简化代码。
我认为这是一种非常适合您的方法。 我们将读取源图像,创建一个目标图像,即您正在寻找的目标颜色,然后我们将从另一个图像中减去一个图像。 然后我们可以查看结果,寻找“相同”容差范围内的任何像素。
首先,您需要读取图像并获取三个(红色、绿色和蓝色)矩阵的像素值。
imgSource = NewImage("$Sample_Images\黑犀牛足迹.jpg");
{ rSource, gSource, bSource } = imgSource << getPixels("rgb");
win = newWindow("源图像", imgSource);
接下来,定义您要匹配的目标颜色。 我将为此示例创建灰色,但您可以指定任何值(0.0 - 1.0 之间)。
r值=0.5;
g值=0.5;
b值=0.5;
现在让我们创建新的矩阵来表示我们的目标彩色图像。 这些矩阵应与源图像大小相同,以目标颜色作为值。
{ wd, ht } = imgSource << getSize();
rTarget = J(ht, wd, rValue);
gTarget = J(ht, wd, gValue);
bTarget = J(ht, wd, bValue);
现在让我们从另一个中减去一个(对于每个颜色分量)。
rDiff = abs(rSource - rTarget);
gDiff = abs(gSource - gTarget);
bDiff = abs(bSource - bTarget);
现在我们将定义我们的容忍度。 这就是我们认为“相同”的程度。 可以说 2% 之内已经足够接近了。
公差=0.02;
现在我们可以循环遍历差异矩阵,查找哪些值小于容差。 有两种方法可以做到这一点。 一种方法是查看 r、g 和 b,看看这三个值是否都小于容差。 另一种方法是将三个差异矩阵组合成一个强度(灰度)矩阵,然后只查看每个像素的一个强度值。 我个人更喜欢这种方法。 所以我要先转换为灰度矩阵。
意向 = 0.30*rDiff + 0.59*gDiff + 0.11*bDiff;
现在,我将循环遍历强度矩阵,将每个值与容差进行比较。
对于 (y = 1, y <= ht, y++,
对于 (x = 1, x < wd, x++,
if (意图[y,x] < 容差,
// 找到一个“相同”的像素,让其在原始中变为“红色”,以便它显示出来
rSource[y,x] = 1.0;
gSource[y,x] = 0.0;
b源[y,x] = 0.0;
);
);
);
现在让我们将新值设置回原始图像,以便我们可以看到我们找到的像素
imgSource << setpixels("rgb", {rSource, gSource, bSource});
这就是全部!:)
同样,如果您正在处理灰度图像并搜索灰度值,事情会变得更容易,因为对于源和目标,我们只使用一个矩阵而不是 3 个矩阵。
您可能想查看我放在文件交换中的一些图像示例。 文件,图像示例.jsl和图像差异.jsl可能是最有用的。 另外,我有一些博客文章讨论对图像进行颜色分析,例如大象脚的图像分析。
我希望这有帮助!
约翰