চিত্রগুলিতে গ্রেডিয়েন্টস এবং এজগুলি কীভাবে সনাক্ত করবেন?


17

আমি নীচের বাম ছবিতে দেখানো চিত্রের মতো একটি রেডিয়াল গ্রেডিয়েন্টের কেন্দ্রস্থলে চিত্রগুলিতে পয়েন্টগুলি সন্ধান করতে সক্ষম হতে চাই। আমি কীভাবে হফ ট্রান্সফর্ম বা অন্য কোনও কম্পিউটার ভিশন পদ্ধতি ব্যবহার করতে পারি সে সম্পর্কে কোনও ধারণা?

ধন্যবাদ

এখানে চিত্র বর্ণনা লিখুন

উদাহরণ অনুসন্ধানের চিত্র:

এখানে চিত্র বর্ণনা লিখুন


দুর্দান্ত প্রশ্ন!
স্পেসি

এছাড়াও গ্রেডিয়েন্টগুলি অনুমান করার একটি উদাহরণ হিসাবে রবার্টস ক্রস: ( en.wikedia.org/wiki/Roberts_Cross ) একবার দেখুন।
স্পেসি

একটি ছোট sobel অপারেটর মত দেখাচ্ছে। আমি কিভাবে রেডিয়াল গ্রেডিয়েন্ট সন্ধান করতে এটি ব্যবহার করব তা নিশ্চিত নই
waspinator

@ ওয়াসপিনেটার: আচ্ছা আপনি কি নিজের ইমেজে সোবল অপারেটর চালিয়ে আউটপুট দেখেছেন? এটি 1D ফাংশনের ডেরিভেটিভ নেওয়ার 2D সমমানের মতো, সুতরাং এটি স্থানীয় মিনিমা বা ম্যাক্সিমায় 0 ছাড়িয়ে যাবে?
এন্ডোলিথ

1
একটি সহজ হাফ-এর মতো পদ্ধতির জন্য যা সম্ভবত এটি কাজ করতে পারে আপনি চেষ্টা করতে পারেন: চিত্রের প্রতিটি পিক্সেলের জন্য, গ্রেডিয়েন্ট দিকটি গণনা করুন এবং এই পিক্সেল থেকে শুরু করে গ্রেডিয়েন্টের দিকের দিকে একটি সংক্ষিপ্ত আকারে একটি সংক্ষিপ্ত আকারে রেন্ডার করুন। আপনি যে সেন্টার পয়েন্টগুলির সন্ধান করছেন সেটি হ'ল সঞ্চয়ের সর্বোচ্চ শিখর (বড় ব্যবধানে) হওয়া উচিত।
কোলেটেনবার্ট

উত্তর:


7

আমি ওপেনসিভিতে কাজ করছিলাম এবং দূরত্ব রূপান্তর দ্বারা উত্পন্ন গ্রেডিয়েন্টের শিখরটি সন্ধান করার চেষ্টা করছিলাম। আমি বুঝতে পেরেছি যে ধূসর-স্কেল চিত্রগুলিতে মরফোলজিক অপারেশন (ক্ষয় / প্রসারণ) ব্যবহার এই ক্ষেত্রে খুব দরকারী। যদি আপনি ধূসর-স্কেল চিত্রটি খসিয়ে ফেলে থাকেন তবে যে কোনও পিক্সেল নিম্ন / সর্বোচ্চ প্রতিবেশীর মান নিতে চলেছে। আপনি একই ধরণের / ক্ষয়প্রাপ্ত চিত্র থেকে ধূসর-স্কেল চিত্র বিয়োগ করে গ্রেডিয়েন্টগুলিতে তীব্রতার শিখরগুলি খুঁজে পেতে পারেন। এখানে আমার ফলাফল: এখানে চিত্র বর্ণনা লিখুন

ওপেনসিভি / সিপিপিতে এটি করার একটি উপায়:

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

int main( int argc, char** argv ){

    cv::Mat objects, img ,peaks,BGR;
    std::vector<std::vector<cv::Point> > contours;
    /* Reads the image*/
    BGR=cv::imread(argv[1]);
    /* Converts it to Grayscale*/
    cv::cvtColor(BGR,img,CV_BGR2GRAY);
    /* Devine where are the objects*/
    cv::threshold(img,objects,0,255,cv::THRESH_BINARY);
    /* In order to find the local maxima, "distance"
     * is subtracted from the result of the dilatation of
     * "distance". All the peaks keep the save value */
    cv::dilate(img,peaks,cv::Mat(),cv::Point(-1,-1),3);
    cv::dilate(objects,objects,cv::Mat(),cv::Point(-1,-1),3);

    /* Now all the peaks should be exactely 0*/
    peaks=peaks-img;

    /* And the non-peaks 255*/
    cv::threshold(peaks,peaks,0,255,cv::THRESH_BINARY);
    peaks.convertTo(peaks,CV_8U);

    /* Only the zero values of "peaks" that are non-zero
     * in "objects" are the real peaks*/
    cv::bitwise_xor(peaks,objects,peaks);

    /* The peaks that are distant from less than
     * 2 pixels are merged by dilatation */
    cv::dilate(peaks,peaks,cv::Mat(),cv::Point(-1,-1),1);

    /* In order to map the peaks, findContours() is used.
     * The results are stored in "contours" */
    cv::findContours(peaks, contours, CV_RETR_CCOMP, CV_CHAIN_APPROX_SIMPLE);
    /* just draw them and save the image */
    cv::drawContours(BGR,contours,-1,cv::Scalar(255,0,0),-1);
    cv::imwrite("result.png",BGR);

    return 1;
}

5

আমার এখন পর্যন্ত যা আছে তা এখানে। আমি যেভাবে আমার হাইফ স্পেসকে জনবহুল করছি তা অনুকূল থেকে অনেক দূরে। আমি নিশ্চিত যে এটির আরও দ্রুত করার জন্য আমি কিছুটা ভেক্টরাইজেশন করতে পারি pretty আমি মতলব আর ২০১১ এ ব্যবহার করছি। আসল চিত্র

পরামর্শ প্রশংসা করা হয়, আপনাকে ধন্যবাদ।

এখানে চিত্র বর্ণনা লিখুন

clear all; clc; close all;

%% read in image and find gradient information
img = rgb2gray(imread('123.png'));
[rows, columns] = size(img);
[dx, dy] = gradient(double(img));
[x y] = meshgrid(1:columns, 1:rows);
u = dx;
v = dy;
imshow(img);
hold on
quiver(x, y, u, v)


%% create Hough space and populate
hough_space = zeros(size(img));

for i = 1:columns
  for j = 1:rows

    X1 = i;
    Y1 = j;
    X2 = round(i + dx(j,i));
    Y2 = round(j + dy(j,i));
    increment = 1;

    slope = (Y2 - Y1) / (X2 - X1);
    y_intercept = Y1 - slope * X1;

    X3 = X1 + 5;

    if X3 < columns && X3 > 1
      Y3 = slope * X3 + y_intercept;
      if Y3 < rows && Y3 > 1
        hough_space = func_Drawline(hough_space, Y1, X1, floor(Y3), floor(X3), increment);
      end
    end
  end
end

imtool(hough_space)

আমি একটি অঙ্কিত রেখার ফাংশনটি সংশোধন করেছি যা আমি মাতলাব কেন্দ্রীয়কে পিক্সেল দ্বারা একটি মানে পিক্সেল সেট করার পরিবর্তে একটি পিক্সেল দ্বারা বৃদ্ধি করার জন্য পেয়েছি

function Img = func_DrawLine(Img, X0, Y0, X1, Y1, nG)
% Connect two pixels in an image with the desired graylevel
%
% Command line
% ------------
% result = func_DrawLine(Img, X1, Y1, X2, Y2)
% input:    Img : the original image.
%           (X1, Y1), (X2, Y2) : points to connect.
%           nG : the gray level of the line.
% output:   result
%
% Note
% ----
%   Img can be anything
%   (X1, Y1), (X2, Y2) should be NOT be OUT of the Img
%
%   The computation cost of this program is around half as Cubas's [1]
%   [1] As for Cubas's code, please refer  
%   http://www.mathworks.com/matlabcentral/fileexchange/loadFile.do?objectId=4177  
%
% Example
% -------
% result = func_DrawLine(zeros(5, 10), 2, 1, 5, 10, 1)
% result =
%      0     0     0     0     0     0     0     0     0     0
%      1     1     1     0     0     0     0     0     0     0
%      0     0     0     1     1     1     0     0     0     0
%      0     0     0     0     0     0     1     1     1     0
%      0     0     0     0     0     0     0     0     0     1
%
%
% Jing Tian Oct. 31 2000
% scuteejtian@hotmail.com
% This program is written in Oct.2000 during my postgraduate in 
% GuangZhou, P. R. China.
% Version 1.0

Img(X0, Y0) = Img(X0, Y0) + nG;
Img(X1, Y1) = Img(X1, Y1) + nG;
if abs(X1 - X0) <= abs(Y1 - Y0)
   if Y1 < Y0
      k = X1; X1 = X0; X0 = k;
      k = Y1; Y1 = Y0; Y0 = k;
   end
   if (X1 >= X0) & (Y1 >= Y0)
      dy = Y1-Y0; dx = X1-X0;
      p = 2*dx; n = 2*dy - 2*dx; tn = dy;
      while (Y0 < Y1)
         if tn >= 0
            tn = tn - p;
         else
            tn = tn + n; X0 = X0 + 1;
         end
         Y0 = Y0 + 1; Img(X0, Y0) = Img(X0, Y0) + nG;
      end
   else
      dy = Y1 - Y0; dx = X1 - X0;
      p = -2*dx; n = 2*dy + 2*dx; tn = dy;
      while (Y0 <= Y1)
         if tn >= 0
            tn = tn - p;
         else
            tn = tn + n; X0 = X0 - 1;
         end
         Y0 = Y0 + 1; Img(X0, Y0) = Img(X0, Y0) + nG;
      end
   end
else if X1 < X0
      k = X1; X1 = X0; X0 = k;
      k = Y1; Y1 = Y0; Y0 = k;
   end
   if (X1 >= X0) & (Y1 >= Y0)
      dy = Y1 - Y0; dx = X1 - X0;
      p = 2*dy; n = 2*dx-2*dy; tn = dx;
      while (X0 < X1)
         if tn >= 0
            tn = tn - p;
         else
            tn = tn + n; Y0 = Y0 + 1;
         end
         X0 = X0 + 1; Img(X0, Y0) = Img(X0, Y0) + nG;
      end
   else
      dy = Y1 - Y0; dx = X1 - X0;
      p = -2*dy; n = 2*dy + 2*dx; tn = dx;
      while (X0 < X1)
         if tn >= 0
            tn = tn - p;
         else
            tn = tn + n; Y0 = Y0 - 1;
         end
         X0 = X0 + 1; Img(X0, Y0) = Img(X0, Y0) + nG;
      end
   end
end

আমি মনে করি যে আমি আপনার উত্তরের অনুগ্রহটিকে দায়ী করব, কারণ অন্য কেউ অবদান রাখেনি। এটি আমি যা চাই ঠিক তা নয় তবে এটি of এর নিকটতমতম 3.. আপনি কি আরও এই পদ্ধতির উন্নতি করেছেন?
কেপ কোড

1

চিত্রের প্যাচগুলির উপরে ওরিয়েন্টেড গ্রেডিয়েন্টগুলির একটি হিস্টোগ্রাম চালান - এই হিস্টোগ্রামগুলির প্রত্যেকটির শীর্ষটি আপনাকে সেই প্যাচের প্রভাবশালী দিকনির্দেশনা দেবে (আপনি যে তীরগুলি দেখান তার মতো)।

এই সমস্ত তীরটি কোথায় ছেদ করে তা সন্ধান করুন - যদি সেই বিন্দুটি বস্তুর ভিতরে থাকে তবে এটি কোনও রেডিয়াল গ্রেডিয়েন্টের কেন্দ্র হতে পারে।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.