【问题标题】:How to scan gray level image pixel by pixel and assign labels to pixels without using bwlabel? [duplicate]如何在不使用 bwlabel 的情况下逐像素扫描灰度图像并为像素分配标签? [复制]
【发布时间】:2017-10-01 06:40:00
【问题描述】:

我有一个灰度图像。我想使用 8 个邻居从左到右和从上到下逐个像素地扫描图像。 我想检查有多少邻居是 1 或更大,邻居的值是多少?我想根据邻居的值标记像素

[m n]=size(Img)
kernel = [-1 -1 -1; -1 8 -1; -1 -1 -1];
outputImage = conv2(I, kernel);
for i=1:m
 for j=1:n
   if(Img(I,j)==1) check neighbours
end
end

如果我有一个图像

D =

 1     0     1     0     1     0
 0     1     0     1     0     1
 1     0     1     0     1     0
 0     1     1     0     1     0
 1     0     0     1     0     1
 0     0     0     1     0     0

no.of 邻居被计为

邻居=

 1     3     2     3     2     2
 3     2     3     3     3     2
 1     3     2     2     1     1
 2     4     2     3     1     1
 1     2     3     2     3     1
 1     1     2     1     3     1

从左到右扫描 D(1,1)==1 and neighbour(1,1)>=1 所以将其标记为 1,因为没有标记邻居。如果标记的邻居之一,则复制它,如果超过一个邻居被标记,然后复制其中一个标签并将其标记为等效

我在这张图片上试过你的代码

但所有标签都是 1。但是 bwlabel 会产生不同的结果

【问题讨论】:

标签: matlab image-processing


【解决方案1】:

首先使用阈值 1 对图像进行二值化

应用正确的内核,因此卷积将导致“激活”邻居的数量

Img_binarized = double(Img >= 1);
kernel = [1 1 1; 1 0 1; 1 1 1];
Img2 = conv2(Img_binarized, kernel);
% here each pixel of Img2 contains the number of neighbours >= 1

【讨论】:

  • 您必须在问题中指定您真正想要做什么。用一个 5x5 矩阵写一个小例子,告诉我们你想要实现什么。这个答案告诉你“有多少邻居是 1 或更大”,这是你的问题。
  • Img=[1 0 1 0 1 0;0 1 0 1 0 1;1 0 1 0 1 0;0 1 1 0 1 0;1 0 0 1 0 1; 0 0 0 1 0 0]; img=双(Img); Img_binarized = Img >= 1 内核 = [1 1 1; 1 0 1; 1 1 1]; Img2 = conv2(Img_binarized, kernel);
  • 使用 conv2 时出错第一个和第二个参数必须是单参数或双参数。 Untitled6 中的错误(第 5 行)Img2 = conv2(Img_binarized, kernel);
  • 算了。您应该编辑您的问题并通过示例清楚地解释您要达到的目标。任何人都不会阅读或考虑此处的任何 cmets。
  • @Sembei Norimaki 更新了问题。你的回答产生错误
猜你喜欢
  • 1970-01-01
  • 2018-11-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多