/*
 * Copyright (c) 2011-2016, Peter Abeles. All Rights Reserved.
 *
 * This file is part of BoofCV (http://boofcv.org).
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *   http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package boofcv.demonstrations.filter;

import boofcv.abst.distort.FDistort;
import boofcv.alg.filter.kernel.GKernelMath;
import boofcv.alg.filter.kernel.SteerableKernel;
import boofcv.alg.misc.GImageStatistics;
import boofcv.core.image.GeneralizedImageOps;
import boofcv.gui.ListDisplayPanel;
import boofcv.gui.SelectAlgorithmPanel;
import boofcv.gui.image.VisualizeImageData;
import boofcv.struct.convolve.Kernel2D;
import boofcv.struct.image.ImageGray;

import javax.swing.*;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.List;


/**
 * @author Peter Abeles
 */
public abstract class DisplaySteerableBase
		extends SelectAlgorithmPanel
{
	protected static int imageSize = 400;
	protected static int radius = 100;

	protected Class imageType;
	protected Class kernelType;

	ListDisplayPanel basisPanel = new ListDisplayPanel();
	ListDisplayPanel steerPanel = new ListDisplayPanel();

	T largeImg;

	List order = new ArrayList();

	public DisplaySteerableBase(Class imageType, Class kernelType) {

		this.imageType = imageType;
		this.kernelType = kernelType;

		largeImg = GeneralizedImageOps.createSingleBand(imageType, imageSize, imageSize);

		addAlgorithm("Deriv X",new DisplayGaussianKernelApp.DerivType(1,0));
		addAlgorithm("Deriv XX",new DisplayGaussianKernelApp.DerivType(2,0));
		addAlgorithm("Deriv XXX",new DisplayGaussianKernelApp.DerivType(3,0));
		addAlgorithm("Deriv XXXX",new DisplayGaussianKernelApp.DerivType(4,0));
		addAlgorithm("Deriv XY",new DisplayGaussianKernelApp.DerivType(1,1));
		addAlgorithm("Deriv XXY",new DisplayGaussianKernelApp.DerivType(2,1));
		addAlgorithm("Deriv XYY",new DisplayGaussianKernelApp.DerivType(1,2));
		addAlgorithm("Deriv XXXY",new DisplayGaussianKernelApp.DerivType(3,1));
		addAlgorithm("Deriv XXYY",new DisplayGaussianKernelApp.DerivType(2,2));
		addAlgorithm("Deriv XYYY", new DisplayGaussianKernelApp.DerivType(1, 3));

		JPanel content = new JPanel(new GridLayout(0,2));
		content.add(basisPanel);
		content.add(steerPanel);
		setMainGUI(content);
	}

	protected abstract SteerableKernel createKernel( int orderX , int orderY );

	@Override
	public void setActiveAlgorithm(String name, Object cookie) {
		DisplayGaussianKernelApp.DerivType dt = (DisplayGaussianKernelApp.DerivType)cookie;

		// add basis
		SteerableKernel steerable = createKernel(dt.orderX,dt.orderY);
		basisPanel.reset();

		for( int i = 0; i < steerable.getBasisSize(); i++ ) {
			T smallImg = GKernelMath.convertToImage(steerable.getBasis(i));
			new FDistort(smallImg,largeImg).scaleExt().interpNN().apply();

			double maxValue = GImageStatistics.maxAbs(largeImg);
			BufferedImage out = VisualizeImageData.colorizeSign(largeImg,null,maxValue);
			basisPanel.addImage(out,"Basis "+i);
		}

		// add steered kernels
		steerPanel.reset();

		for( int i = 0; i <= 20; i++  ) {
			double angle = Math.PI*i/20.0;

			K kernel = steerable.compute(angle);

			T smallImg = GKernelMath.convertToImage(kernel);
			new FDistort(smallImg,largeImg).scaleExt().interpNN().apply();

			double maxValue = GImageStatistics.maxAbs(largeImg);
			BufferedImage out = VisualizeImageData.colorizeSign(largeImg,null,maxValue);

			steerPanel.addImage(out,String.format("%5d",(int)(180.0*angle/Math.PI)));
		}
		repaint();
	}

}

 

Ads help maintain this website.