2016-10-20 14 views
2

Обратитесь к this article.Пользовательский банк фильтров не генерирует ожидаемый выход

Я внедрил раздел 4.1 (Предварительная обработка).

Шаг предварительной обработки предназначен для улучшения функций изображения по набору выбранных направлений. Во-первых, изображение серого масштабирования и фильтруется с помощью фильтра заточки (мы вычитаем из изображения его локально-среднюю отфильтрованную версию ), тем самым устраняя компонент постоянного тока.

Мы выбрали 12 неперекрывающихся фильтров, чтобы проанализировать 12 разных направлений, повернутых относительно 15 ° друг к другу.

GitHub Repositiry is here.

Поскольку данная формула в статье неверно, я попробовал два набора различных формул.

Первый набор формулы,

enter image description here

enter image description here

Второй набор формулы,

enter image description here

Ожидаемый о utput должно быть,

enter image description here

Ни один из них дают правильные результаты.

enter image description here

Может кто-нибудь предложить мне какие-либо изменения?


GitHub Repository is here.

Большая relevalt часть исходного кода находится здесь:

public List<Bitmap> Apply(Bitmap bitmap) 
    { 
     Kernels = new List<KassWitkinKernel>(); 

     double degrees = FilterAngle; 

     KassWitkinKernel kernel; 
     for (int i = 0; i < NoOfFilters; i++) 
     { 
      kernel = new KassWitkinKernel(); 
      kernel.Width = KernelDimension; 
      kernel.Height = KernelDimension; 
      kernel.CenterX = (kernel.Width)/2; 
      kernel.CenterY = (kernel.Height)/2; 
      kernel.Du = 2; 
      kernel.Dv = 2; 
      kernel.ThetaInRadian = Tools.DegreeToRadian(degrees); 
      kernel.Compute(); 

      //SleuthEye 
      kernel.Pad(kernel.Width, kernel.Height, WidthWithPadding, HeightWithPadding); 

      Kernels.Add(kernel); 

      degrees += degrees; 
     } 

     List<Bitmap> list = new List<Bitmap>(); 

     Bitmap image = (Bitmap)bitmap.Clone(); 

     //PictureBoxForm f = new PictureBoxForm(image); 
     //f.ShowDialog(); 

     Complex[,] cImagePadded = ImageDataConverter.ToComplex(image); 

     Complex[,] fftImage = FourierTransform.ForwardFFT(cImagePadded); 

     foreach (KassWitkinKernel k in Kernels) 
     { 
      Complex[,] cKernelPadded = k.ToComplexPadded(); 
      Complex[,] convolved = Convolution.ConvolveInFrequencyDomain(fftImage, cKernelPadded); 

      Bitmap temp = ImageDataConverter.ToBitmap(convolved); 



      list.Add(temp); 
     } 

     return list; 
    } 
+1

Есть определенные причины, которые вы выбрали не идти с [мои измененные версии 'uStar' и' vStar'] (http://stackoverflow.com/a/39339327/2994596)? – SleuthEye

+0

Если «ни один из них не дает правильных результатов», вы имеете в виду, что они не дают * сами по себе * плакат результатов в ссылочной статье, то я согласен. Вот почему я добавил комментарий «если намерение состоит в том, чтобы воспроизвести результаты статьи, которые у вас все еще есть, чтобы преодолеть другие препятствия. Первый из них заключается в том, чтобы на самом деле использовать заостренное изображение в качестве входа в банк фильтров» в конце моего после. – SleuthEye

+0

Из того, что я помню, сначала передавал изображение через фильтр заточки (как описано в заявлении «Во-первых, изображение серого масштабируется и фильтруется с помощью фильтра заточки (мы вычитаем из изображения его локально-среднюю отфильтрованную версию), тем самым устраняя DC "из бумаги) значительно улучшило результаты. – SleuthEye

ответ

1

Возможно, первая вещь, которую следует отметить, что фильтры должны быть сгенерированы с углами, которые должны увеличить в FilterAngle (в вашем случае 15 градусов) увеличивается.Это может быть достигнуто путем изменения KassWitkinFilterBank.Apply как последуйте (см this commit):

public List<Bitmap> Apply(Bitmap bitmap) 
{ 
    // ... 

    // The generated template filter from the equations gives a line at 45 degrees. 
    // To get the filter to highlight lines starting with an angle of 90 degrees 
    // we should start with an additional 45 degrees offset. 
    double degrees = 45; 

    KassWitkinKernel kernel; 
    for (int i = 0; i < NoOfFilters; i++) 
    { 
     // ... setup filter (unchanged) 

     // Now increment the angle by FilterAngle 
     // (not "+= degrees" which doubles the value at each step) 
     degrees += FilterAngle; 
    } 

Это должно дать вам следующий результат:

enter image description here

Это не совсем результат от бумаги и различия между изображениями все еще довольно тонкие, но вы должны иметь возможность заметить, что линия царапины наиболее интенсивна на восьмом рисунке (как и следовало ожидать, поскольку угол скручивания составляет приблизительно 100-105 градусов).

Для того, чтобы улучшить результат, мы должны кормить фильтры с предварительно обработанное изображение таким же образом, как описано в статье:

Во-первых, изображение серым и фильтруют с помощью фильтра резкости (мы вычитаем из изображения его локально-среднюю отфильтрованную версию), тем самым исключая компонент постоянного тока

Когда вы это сделаете, вы получите матрицу значений, некоторые из которых будут отрицательными. В результате этот результат промежуточной обработки не подходит для хранения в виде Bitmap. Как правило, при выполнении обработки изображений вы должны сохранить все промежуточные результаты в double или Complex, если необходимо, и только конвертировать окончательный результат обратно в Bitmap для визуализации.

Интеграция изменений, чтобы добавить резкости изображения из your GitHub repository, сохраняя при этом промежуточные результаты, как двойник можно достичь путем изменения переменных входных bitmap и временная image использовать double[,] тип данных вместо Bitmap в методе KassWitkinFilterBank.Apply (см this commit):

public List<Bitmap> Apply(double[,] bitmap) 
{ 
    // [...] 

    double[,] image = (double[,])bitmap.Clone(); 

    // [...] 
} 

, который должен дать вам следующий результат:

enter image description here

Или лучше выделить разницу, вот цифра 1 (0 градусов) на левой стороне, рядом цифра 8 (105 градусов), справа:

enter image description here

 Смежные вопросы

  • Нет связанных вопросов^_^