【问题标题】:Number of black pixels with no black pixel as right neighbour没有黑色像素作为右邻的黑色像素的数量
【发布时间】:2017-10-10 10:26:17
【问题描述】:

我正在尝试查找在右上、右上、右下任意位置上没有黑色像素邻居的黑色像素的数量。

mask1 = [0|1 0|1 0; 0|1 0|1 0; 0|1 0|1 0];
black = double (x28462847_1_1 < 128);
result = conv2 (black, mask1, 'same');
count = sum (result(:) == 1)

我试过用这个面具。有谁知道我哪里出错了

【问题讨论】:

  • 为什么不确定是否正确?您将小于 128 的东西定义为黑色还是黑色 = 0?
  • @AnderBiguri 它给出了错误的结果
  • 请提供minimal reproducible example,即为x28462847_1_1定义一个示例。
  • @m7913d 这只是一个简单的二进制图像
  • @user8751608 只需包含一个以使其清晰或即时构建(随机)示例。包括预期的结果将使每个人都清楚问题。

标签: matlab


【解决方案1】:

要检测在其 3 个(上/下)右侧像素中没有黑色像素的所有黑色像素(一个),您可以使用以下掩码计算互相关:

mask = [0  0  -1; 
        0  1  -1; 
        0  0  -1];

所需位置的结果将为1,而其他位置的结果将更小。

result = conv2 (double(black), rot90(mask,2), 'same') == 1; % Note that I used `conv2` with `rot90` to calculate the cross correlation. 
count = sum (result(:)); % count the number of desired elements

示例

如下图

rng('default')
black = rand(10) > 0.8;

我得到以下结果:

figure
imshow(~black, 'InitialMagnification','fit')
hold on
[x, y] = find(result);
plot(y, x, '*') % highlight the found positions with an asterisk

【讨论】:

  • 谢谢,这很有帮助。从您上面的回答中,我已经能够弄清楚如何根据不同的邻居更换口罩。更进一步,你知道如何计算满足一条规则或另一条规则的黑色像素的数量吗?
  • 您可以使用find(result1 | result2),它将执行元素逻辑或。
【解决方案2】:

我认为最好的方法是:

notblack=black>0; %if its not zero, then its not black

mask=[0 1 0; 1 0 1; 0 1 0]% or mask=[0 0 1; 0 0 1; 0 0 1]; in your case.

result = conv2(double(notblack),mask, 'same'); % sum all values


count=sum(result(:)==sum(mask(:)));

【讨论】:

  • thisones 是什么意思?你为什么用那个面具?
  • @user8751608 错字。如果您了解卷积,您会注意到该掩码会将具有“1”的值相加。因此,如果答案是像素中的 4,则意味着像素的那些邻居是“1”。蒙版是一个例子,对不起,你可以修改蒙版来选择哪些像素对你很重要
猜你喜欢
  • 2012-04-27
  • 2018-09-28
  • 2019-12-13
  • 2015-05-05
  • 1970-01-01
  • 2015-02-04
  • 2018-02-22
  • 2019-03-28
  • 1970-01-01
相关资源
最近更新 更多