void imProcessRotate180(const imImage* src_image, imImage* dst_image) { int src_depth = src_image->has_alpha? src_image->depth+1: src_image->depth; for (int i = 0; i < src_depth; i++) { switch(src_image->data_type) { case IM_BYTE: Rotate180(src_image->width, src_image->height, (imbyte*)src_image->data[i], dst_image->width, dst_image->height, (imbyte*)dst_image->data[i]); break; case IM_USHORT: Rotate180(src_image->width, src_image->height, (imushort*)src_image->data[i], dst_image->width, dst_image->height, (imushort*)dst_image->data[i]); break; case IM_INT: Rotate180(src_image->width, src_image->height, (int*)src_image->data[i], dst_image->width, dst_image->height, (int*)dst_image->data[i]); break; case IM_FLOAT: Rotate180(src_image->width, src_image->height, (float*)src_image->data[i], dst_image->width, dst_image->height, (float*)dst_image->data[i]); break; case IM_CFLOAT: Rotate180(src_image->width, src_image->height, (imcfloat*)src_image->data[i], dst_image->width, dst_image->height, (imcfloat*)dst_image->data[i]); break; } } }
void FeedBackward(const arma::Cube<eT>& error) { delta = arma::zeros<arma::Cube<eT> >(inputLayer.InputActivation().n_rows, inputLayer.InputActivation().n_cols, inputLayer.InputActivation().n_slices); for (size_t outputmap = 0; outputmap < inputLayer.OutputMaps(); outputmap++) { for (size_t inputmap = 0; inputmap < outputLayer.OutputMaps(); inputmap++) { arma::Cube<eT> errorSlices = error.slices(inputmap * inputLayer.LayerSlices(), (inputmap * inputLayer.LayerSlices()) + inputLayer.LayerSlices() - 1); arma::Mat<eT> rotatedFilter; Rotate180(weights.slice( outputmap * outputLayer.OutputMaps() + inputmap), rotatedFilter); arma::Cube<eT> output; BackwardConvolutionRule::Convolution(errorSlices, rotatedFilter, output); delta.slices((outputmap * inputLayer.LayerSlices()), (outputmap * inputLayer.LayerSlices()) + inputLayer.LayerSlices() - 1) += output; } } }
void Backward(const arma::Cube<eT>& /* unused */, const arma::Cube<eT>& gy, arma::Cube<eT>& g) { g = arma::zeros<arma::Cube<eT> >(inputParameter.n_rows, inputParameter.n_cols, inputParameter.n_slices); for (size_t outMap = 0, outMapIdx = 0; outMap < inMaps; outMap++) { for (size_t inMap = 0; inMap < outMaps; inMap++, outMapIdx++) { arma::Mat<eT> rotatedFilter; Rotate180(weights.slice(outMap * outMaps + inMap), rotatedFilter); arma::Mat<eT> output; BackwardConvolutionRule::Convolution(gy.slice(inMap), rotatedFilter, output); g.slice(outMap) += output; } } }
bool RotationInstance::ExecuteOn( View& view ) { if ( !view.IsMainView() ) return false; // should never reach this point! AutoViewLock lock( view ); ImageVariant image = view.Image(); if ( image.IsComplexSample() ) return false; double degrees = Round( Deg( p_angle ), 4 ); if ( degrees == 0 ) { Console().WriteLn( "<end><cbr><* Identity *>" ); return true; } ImageWindow window = view.Window(); window.RemoveMaskReferences(); window.RemoveMask(); window.DeletePreviews(); Console().EnableAbort(); StandardStatus status; image.SetStatusCallback( &status ); if ( p_optimizeFast ) switch ( TruncI( degrees ) ) { case 90: Rotate90CCW() >> image; return true; case -90: Rotate90CW() >> image; return true; case 180: case -180: Rotate180() >> image; return true; default: break; } AutoPointer<PixelInterpolation> interpolation( NewInterpolation( p_interpolation, 1, 1, 1, 1, true, p_clampingThreshold, p_smoothness, image ) ); Rotation T( *interpolation, p_angle ); /* * On 32-bit systems, make sure the resulting image requires less than 4 GB. */ if ( sizeof( void* ) == sizeof( uint32 ) ) { int width = image.Width(), height = image.Height(); T.GetNewSizes( width, height ); uint64 sz = uint64( width )*uint64( height )*image.NumberOfChannels()*image.BytesPerSample(); if ( sz > uint64( uint32_max-256 ) ) throw Error( "Rotation: Invalid operation: Target image dimensions would exceed four gigabytes" ); } T.SetFillValues( p_fillColor ); T >> image; return true; }