All Downloads are FREE. Search and download functionalities are using the official Maven repository.

boofcv.core.image.GeneralizedImageOps Maven / Gradle / Ivy

Go to download

BoofCV is an open source Java library for real-time computer vision and robotics applications.

There is a newer version: 0.26
Show newest version
/*
 * 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.core.image;

import boofcv.alg.InputSanityCheck;
import boofcv.struct.image.*;
import boofcv.testing.BoofTesting;

/**
 * 

* Operations that return information about the specific image. Useful when writing highly abstracted code * which is independent of the input image. *

* * @author Peter Abeles */ // TODO rename to GImageOps ? public class GeneralizedImageOps { /** * Converts an image from one type to another type. Creates a new image instance if * an output is not provided. * * @param src Input image. Not modified. * @param dst Converted output image. If null a new one will be declared. Modified. * @param typeDst The type of output image. * @return Converted image. */ public static T convert(ImageGray src , T dst , Class typeDst ) { if (dst == null) { dst =(T) createSingleBand(typeDst, src.width, src.height); } else { InputSanityCheck.checkSameShape(src, dst); } GConvertImage.convert(src,dst); return dst; } public static boolean isFloatingPoint(Class imgType) { if( GrayF.class.isAssignableFrom(imgType) ) { return true; } else { return false; } } public static double get(ImageGray img, int x, int y) { if (img instanceof GrayI8) { return ((GrayI8) img).get(x, y); } else if (img instanceof GrayI16) { return ((GrayI16) img).get(x, y); } else if (img instanceof GrayS32) { return ((GrayS32) img).get(x, y); } else if (img instanceof GrayF32) { return ((GrayF32) img).get(x, y); } else if (img instanceof GrayF64) { return ((GrayF64) img).get(x, y); } else if (img instanceof GrayS64) { return ((GrayS64) img).get(x, y); } else { throw new IllegalArgumentException("Unknown or incompatible image type: " + img.getClass().getSimpleName()); } } public static double get(ImageBase img, int x, int y , int band ) { if (img instanceof ImageGray) { return get((ImageGray) img, x, y); } else if (img instanceof ImageInterleaved) { return get((ImageInterleaved) img, x, y, band); } else if (img instanceof Planar) { return get(((Planar) img).getBand(band), x, y); } else { throw new IllegalArgumentException("Unknown or incompatible image type: " + img.getClass().getSimpleName()); } } public static double get(ImageInterleaved img, int x, int y , int band ) { if (img instanceof InterleavedU8) { return ((InterleavedU8) img).getBand(x, y, band); } else if (img instanceof InterleavedS8) { return ((InterleavedS8) img).getBand(x, y, band); } else if (img instanceof InterleavedS16) { return ((InterleavedS16) img).getBand(x, y, band); } else if (img instanceof InterleavedU16) { return ((InterleavedU16) img).getBand(x, y, band); } else if (img instanceof InterleavedS32) { return ((InterleavedS32) img).getBand(x, y, band); } else if (img instanceof InterleavedS64) { return ((InterleavedS64) img).getBand(x, y, band); } else if (img instanceof InterleavedF32) { return ((InterleavedF32) img).getBand(x, y, band); } else if (img instanceof InterleavedF64) { return ((InterleavedF64) img).getBand(x, y, band); } else { throw new IllegalArgumentException("Unknown or incompatible image type: " + img.getClass().getSimpleName()); } } public static T createSingleBand(ImageDataType type, int width, int height) { Class typeClass = ImageType.getImageClass(ImageType.Family.GRAY, type); return createSingleBand(typeClass, width, height); } public static T createImage(Class type, int width, int height, int numBands ) { if( type == Planar.class ) throw new IllegalArgumentException("Can't use this function with planar because the data type needs to be specified too"); if( ImageGray.class.isAssignableFrom(type)) return (T)createSingleBand((Class)type,width,height); else if( ImageInterleaved.class.isAssignableFrom(type)) return (T)createInterleaved((Class)type,width,height,numBands); else throw new RuntimeException("Unknown"); } public static T createSingleBand(Class type, int width, int height) { type = BoofTesting.convertGenericToSpecificType(type); if (type == GrayU8.class) { return (T)new GrayU8(width, height); } else if (type == GrayS8.class) { return (T)new GrayS8(width, height); } else if (type == GrayS16.class) { return (T)new GrayS16(width, height); } else if (type == GrayU16.class) { return (T)new GrayU16(width, height); } else if (type == GrayS32.class) { return (T)new GrayS32(width, height); } else if (type == GrayS64.class) { return (T)new GrayS64(width, height); } else if (type == GrayF32.class) { return (T)new GrayF32(width, height); } else if (type == GrayF64.class) { return (T)new GrayF64(width, height); } else if( type == GrayI.class ) { // ImageInteger is a generic type, so just create something return (T)new GrayS32(width,height); } throw new RuntimeException("Unknown type: "+type.getSimpleName()); } public static T createInterleaved(ImageDataType type, int width, int height , int numBands) { Class typeClass = ImageType.getImageClass(ImageType.Family.INTERLEAVED, type); return createInterleaved(typeClass,width,height,numBands); } public static T createInterleaved(Class type, int width, int height , int numBands) { type = BoofTesting.convertGenericToSpecificType(type); if (type == InterleavedU8.class) { return (T)new InterleavedU8(width, height,numBands); } else if (type == InterleavedS8.class) { return (T)new InterleavedS8(width, height,numBands); } else if (type == InterleavedU16.class) { return (T)new InterleavedU16(width, height,numBands); } else if (type == InterleavedS16.class) { return (T)new InterleavedS16(width, height,numBands); } else if (type == InterleavedS32.class) { return (T)new InterleavedS32(width, height,numBands); } else if (type == InterleavedS64.class) { return (T)new InterleavedS64(width, height,numBands); } else if (type == InterleavedF32.class) { return (T)new InterleavedF32(width, height,numBands); } else if (type == InterleavedF64.class) { return (T)new InterleavedF64(width, height,numBands); } else if( type == ImageInterleaved.class ) { // ImageInteger is a generic type, so just create something return (T)new InterleavedS32(width,height,numBands); } throw new RuntimeException("Unknown type: "+type.getSimpleName()); } public static void set(ImageGray img, int x, int y, double value) { if (GrayI.class.isAssignableFrom(img.getClass())) { ((GrayI)img).set(x,y,(int)value); } else if (img instanceof GrayF32) { ((GrayF32) img).set(x, y,(float)value); } else if (img instanceof GrayF64) { ((GrayF64) img).set(x, y, value); } else if (img instanceof GrayS64) { ((GrayS64) img).set(x, y, (long)value); } else { throw new IllegalArgumentException("Unknown or incompatible image type: " + img.getClass().getSimpleName()); } } public static void setM(ImageBase img, int x, int y, double... value) { if( img instanceof Planar) { Planar ms = (Planar) img; for (int i = 0; i < value.length; i++) { set(ms.getBand(i), x, y, value[i]); } } else if( img instanceof ImageInterleaved ) { for (int band = 0; band < value.length; band++) { if (img instanceof InterleavedU8) { ((InterleavedU8) img).setBand(x, y, band, (byte) value[band]); } else if (img instanceof InterleavedS8) { ((InterleavedS8) img).setBand(x, y, band, (byte) value[band]); } else if (img instanceof InterleavedS16) { ((InterleavedS16) img).setBand(x, y, band, (short) value[band]); } else if (img instanceof InterleavedU16) { ((InterleavedU16) img).setBand(x, y, band, (short) value[band]); } else if (img instanceof InterleavedS32) { ((InterleavedS32) img).setBand(x, y, band, (int) value[band]); } else if (img instanceof InterleavedS64) { ((InterleavedS64) img).setBand(x, y, band, (long) value[band]); } else if (img instanceof InterleavedF32) { ((InterleavedF32) img).setBand(x, y, band, (float) value[band]); } else if (img instanceof InterleavedF64) { ((InterleavedF64) img).setBand(x, y, band, value[band]); } else { throw new IllegalArgumentException("Unknown or incompatible image type: " + img.getClass().getSimpleName()); } } } else if( img instanceof ImageGray) { if( value.length != 1 ) throw new IllegalArgumentException("For a single band image the input pixel must have 1 band"); set((ImageGray)img,x,y,value[0]); } else { throw new IllegalArgumentException("Add support for this image type!"); } } public static void setB(ImageBase img, int x, int y, int band , double value ) { if( img instanceof Planar) { Planar ms = (Planar) img; GeneralizedImageOps.set(ms.getBand(band),x,y,value); } else if( img instanceof ImageInterleaved ) { if (img instanceof InterleavedU8) { ((InterleavedU8) img).setBand(x, y, band, (byte) value); } else if (img instanceof InterleavedS8) { ((InterleavedS8) img).setBand(x, y, band, (byte) value); } else if (img instanceof InterleavedS16) { ((InterleavedS16) img).setBand(x, y, band, (short) value); } else if (img instanceof InterleavedU16) { ((InterleavedU16) img).setBand(x, y, band, (short) value); } else if (img instanceof InterleavedS32) { ((InterleavedS32) img).setBand(x, y, band, (int) value); } else if (img instanceof InterleavedS64) { ((InterleavedS64) img).setBand(x, y, band, (long) value); } else if (img instanceof InterleavedF32) { ((InterleavedF32) img).setBand(x, y, band, (float) value); } else if (img instanceof InterleavedF64) { ((InterleavedF64) img).setBand(x, y, band, value); } else { throw new IllegalArgumentException("Unknown or incompatible image type: " + img.getClass().getSimpleName()); } } else if( img instanceof ImageGray) { if( band != 0 ) throw new IllegalArgumentException("For a single band image the input pixel must have 1 band"); set((ImageGray)img,x,y,value); } else { throw new IllegalArgumentException("Add support for this image type!"); } } public static int getNumBits(Class type) { if (type == GrayU8.class) { return 8; } else if (type == GrayS8.class) { return 8; } else if (type == GrayS16.class) { return 16; } else if (type == GrayU16.class) { return 16; } else if (type == GrayS32.class) { return 32; } else if (type == GrayS64.class) { return 64; } else if (type == GrayF32.class) { return 32; } else if (type == GrayF64.class) { return 64; } throw new RuntimeException("Unknown type: "+type.getSimpleName()); } }




© 2015 - 2025 Weber Informatics LLC | Privacy Policy