Как удалить область без штрих-кода в изображении? - MATLAB - PullRequest
4 голосов
/ 31 января 2012

После того, как я сделал «imclearborder», вокруг штрих-кода все еще остается немного нежелательных объектов.Как я могу удалить эти объекты, чтобы изолировать штрих-код?Я вставил свой код для вашей справки.

Original Image imshow(C) Processed Image

  rgb = imread('barcode2.jpg');
  % Resize Image
  rgb = imresize(rgb,0.33);
  figure(),imshow(rgb);
  % Convert from RGB to Gray
  Igray = double(rgb2gray(rgb));
  % Calculate the Gradients
  [dIx, dIy] = gradient(Igray);
  B = abs(dIx) - abs(dIy);
  % Low-Pass Filtering
  H = fspecial('gaussian', 20, 10);
  C = imfilter(B, H);
  C = imclearborder(C);
  figure(),imagesc(C);colorbar;

Ответы [ 2 ]

1 голос
/ 31 января 2012

Ну, я уже объяснил это в вашем предыдущем вопросе Как найти местоположение красной области на изображении, используя MATLAB? , но с кодом opencv и выходными изображениями.

Вместо того, чтобы запрашивать код, попробуйте реализовать его самостоятельно.

Ниже описано, что делать дальше.

1) преобразовать изображение 'C' в вашем коде в двоичный файл.

2) Примените некоторую эрозию, чтобы удалить небольшие шумы. (На этот раз область штрих-кода также сжимается)

3) Примените расширение, чтобы компенсировать предыдущую эрозию (большая часть шума будет удалена при предыдущей эрозииТак что они не вернутся)

4) Найдите контуры на изображении.

5) Найдите их область.Скорее всего, контур, который имеет максимальную площадь, будет штрих-кодом, потому что другие вещи, такие как буквы, слова и т. Д., Будут маленькими (вы можете понять это по предоставленному вами изображению в градациях серого)

6) Выберите контур с макс.площадь.Нарисуйте ограничивающий прямоугольник для него.

Его результат уже предоставлен в вашем предыдущем вопросе.Это работает очень хорошо.Попробуйте реализовать это самостоятельно с помощью документации MATLAB.Приходите сюда только тогда, когда вы получите ошибку, которую не понимаете.

0 голосов
/ 31 января 2012

Input Image Result

     %%hi, i am ading my code to yours at the end of your code%%%%
     clear all;  

     rgb = imread('barcode.jpeg');
     % Resize Image
     rgb = imresize(rgb,0.33);
     figure(),imshow(rgb);
     % Convert from RGB to Gray
       Igray = double(rgb2gray(rgb));
      Igrayc = Igray;
       % Calculate the Gradients
      [dIx, dIy] = gradient(Igray);
      B = abs(dIx) - abs(dIy);
      % Low-Pass Filtering
      H = fspecial('gaussian', 10, 5);
      C = imfilter(B, H);

      C = imclearborder(C);
      imshow(Igray,[]);
      figure(),imagesc(C);colorbar;


      %%%%%%%%%%%%%%%%%%%%%%%%from here my code starts%%%%%%%%%%%%%%%%
      bw = im2bw(C);%%%binarising the image
      %  imshow(bw);

        %%%%if there are letters or any other noise is present around the barcode
        %%Note: the size of the noise and letters should be smaller than the
        %%barcode size

        labelImage = bwlabel(bw,8);
        len=0;labe=0;
        for i=1:max(max(labelImage))
        a = find(labelImage==i);
        if(len<length(a))
        len=length(a);
        labe=i;
        end
        end

       imag = zeros(size(l));
       imag(find(labelImage==labe))=255;

      %  imtool(imag);

      %%%if Necessary do errossion 
     %  se2 = strel('line',10,0);
     %  imag= imerode(imag,se2);
     %  imag= imerode(imag,se2);

       [r c]= find(imag==255);

      minr = min(r);
      maxc = max(c);
      minc = min(c);
      maxr = max(r);
      imag1 = zeros(size(l));

     for i=minr:maxr
     for j=minc:maxc

      imag1(i,j)=255;
    end

    end


   %  figure,imtool(imag1);

  varit = find(imag1==0);

    Igrayc(varit)=0;
   %%%%%result image having only barcode
   imshow(Igrayc,[]);
   %%%%%original image 
   figure(),imshow(Igray,[]);

Надеюсь, это полезно

...