10 #include <unordered_map>
12 #if IPP_VERSION_INT < \
16 #include <iw++/iw_image_color.hpp>
17 #include <iw++/iw_image_filter.hpp>
18 #include <iw++/iw_image_op.hpp>
19 #include <iw++/iw_image_transform.hpp>
23 #include <ipp/iw++/iw_image_color.hpp>
24 #include <ipp/iw++/iw_image_filter.hpp>
25 #include <ipp/iw++/iw_image_op.hpp>
26 #include <ipp/iw++/iw_image_transform.hpp>
52 const ::ipp::IwiImage ipp_src_im(
54 ToIppDataType(src_dtype), src_im.
GetShape(2) ,
56 src_im.
GetStride(0) * src_dtype.ByteSize());
57 ::ipp::IwiImage ipp_dst_im(
59 ToIppDataType(dst_dtype), dst_im.
GetShape(2) ,
61 dst_im.
GetStride(0) * dst_dtype.ByteSize());
64 ::ipp::iwiScale(ipp_src_im, ipp_dst_im, scale,
offset);
65 }
catch (const ::ipp::IwException &e) {
74 const ::ipp::IwiImage ipp_src_im(
76 ToIppDataType(dtype), src_im.
GetShape(2) ,
79 ::ipp::IwiImage ipp_dst_im(
81 ToIppDataType(dtype), dst_im.
GetShape(2) ,
86 ::ipp::iwiColorConvert(ipp_src_im, ::ipp::iwiColorRGB, ipp_dst_im,
88 }
catch (const ::ipp::IwException &e) {
99 const ::ipp::IwiImage ipp_src_im(
101 ToIppDataType(dtype), src_im.
GetShape(2) ,
104 ::ipp::IwiImage ipp_dst_im(
106 ToIppDataType(dtype), dst_im.
GetShape(2) ,
110 static const std::unordered_map<Image::InterpType, IppiInterpolationType>
119 auto it = type_dict.find(interp_type);
120 if (it == type_dict.end()) {
122 static_cast<int>(interp_type));
126 ::ipp::iwiResize(ipp_src_im, ipp_dst_im, it->second);
127 }
catch (const ::ipp::IwException &e) {
144 const ::ipp::IwiImage ipp_src_im(
146 ToIppDataType(dtype), src_im.
GetShape(2) ,
149 ::ipp::IwiImage ipp_dst_im(
151 ToIppDataType(dtype), dst_im.
GetShape(2) ,
154 ::ipp::IwiImage ipp_mask_im(
160 ::ipp::iwiFilterMorphology(
161 ipp_src_im, ipp_dst_im, ::ipp::iwiMorphDilate, ipp_mask_im,
164 }
catch (const ::ipp::IwException &e) {
178 const ::ipp::IwiImage ipp_src_im(
180 ToIppDataType(dtype), src_im.
GetShape(2) ,
183 ::ipp::IwiImage ipp_dst_im(
185 ToIppDataType(dtype), dst_im.
GetShape(2) ,
188 ::ipp::IwiImage ipp_kernel(
195 ::ipp::iwiFilter(ipp_src_im, ipp_dst_im, ipp_kernel);
196 }
catch (const ::ipp::IwException &e) {
206 float distance_sigma) {
212 const ::ipp::IwiImage ipp_src_im(
214 ToIppDataType(dtype), src_im.
GetShape(2) ,
217 ::ipp::IwiImage ipp_dst_im(
219 ToIppDataType(dtype), dst_im.
GetShape(2) ,
224 ::ipp::iwiFilterBilateral(ipp_src_im, ipp_dst_im, kernel_size / 2,
225 value_sigma * value_sigma,
226 distance_sigma * distance_sigma);
227 }
catch (const ::ipp::IwException &e) {
242 const ::ipp::IwiImage ipp_src_im(
244 ToIppDataType(dtype), src_im.
GetShape(2) ,
247 ::ipp::IwiImage ipp_dst_im(
249 ToIppDataType(dtype), dst_im.
GetShape(2) ,
254 ::ipp::iwiFilterGaussian(ipp_src_im, ipp_dst_im, kernel_size, sigma);
255 }
catch (const ::ipp::IwException &e) {
265 const static std::unordered_map<int, IppiMaskSize> kKernelSizeMap = {
266 {3, ::ipp::ippMskSize3x3},
267 {5, ::ipp::ippMskSize5x5},
269 auto it = kKernelSizeMap.find(kernel_size);
270 if (it == kKernelSizeMap.end()) {
276 const ::ipp::IwiImage ipp_src_im(
281 ::ipp::IwiImage ipp_dst_im_dx(
283 ToIppDataType(dst_im_dx.
GetDtype()),
287 ::ipp::IwiImage ipp_dst_im_dy(
289 ToIppDataType(dst_im_dy.
GetDtype()),
295 ::ipp::iwiFilterSobel(ipp_src_im, ipp_dst_im_dx,
296 IwiDerivativeType::iwiDerivVerFirst, it->second);
297 ::ipp::iwiFilterSobel(ipp_src_im, ipp_dst_im_dy,
298 IwiDerivativeType::iwiDerivHorFirst, it->second);
303 }
catch (const ::ipp::IwException &e) {
319 "Source ({}) and destination ({}) image dtypes are different!",
331 static const std::unordered_map<Image::InterpType, int> interp_dict = {
340 auto interp_it = interp_dict.find(interp_type);
341 if (interp_it == interp_dict.end()) {
343 static_cast<int>(interp_type));
346 IppiSize src_size{
static_cast<int>(src_im.
GetShape(1)),
347 static_cast<int>(src_im.
GetShape(0))},
348 dst_roi_size{
static_cast<int>(dst_im.
GetShape(1)),
349 static_cast<int>(dst_im.
GetShape(0))};
350 IppiRect src_roi{0, 0,
static_cast<int>(src_im.
GetShape(1)),
351 static_cast<int>(src_im.
GetShape(0))};
352 IppStatus sts = ippStsNoErr;
367 const auto p_src_im = src_im.
GetDataPtr<
float>();
369 const auto p_dst2src_xmap = dst2src_xmap.
GetDataPtr<
float>();
370 const auto p_dst2src_ymap = dst2src_ymap.
GetDataPtr<
float>();
371 sts = ippiRemap_32f_C4R(p_src_im, src_size, src_step, src_roi,
372 p_dst2src_xmap, xmap_step, p_dst2src_ymap,
373 ymap_step, p_dst_im, dst_step, dst_roi_size,
377 "Remap not implemented for dtype ({}) and channels ({}).",
380 if (sts != ippStsNoErr) {
std::string ToString() const
Tensor Neg_()
Element-wise negation of a tensor, in-place.
int64_t GetStride(int64_t dim) const
Device GetDevice() const override
static Tensor Ones(const SizeVector &shape, Dtype dtype, const Device &device=Device("CPU:0"))
Create a tensor fill with ones.
SizeVector GetShape() const
InterpType
Image interpolation algorithms.
@ Super
Super sampling interpolation (only downsample).
@ Lanczos
Lanczos filter interpolation.
@ Linear
Bilinear interpolation.
@ Nearest
Nearest neighbors interpolation.
@ Cubic
Bicubic interpolation.
void To(const core::Tensor &src_im, core::Tensor &dst_im, double scale, double offset)
void Dilate(const core::Tensor &src_im, core::Tensor &dst_im, int kernel_size)
void FilterBilateral(const core::Tensor &src_im, core::Tensor &dst_im, int kernel_size, float value_sigma, float distance_sigma)
void Remap(const core::Tensor &src_im, const core::Tensor &dst2src_xmap, const core::Tensor &dst2src_ymap, core::Tensor &dst_im, Image::InterpType interp_type)
void Filter(const core::Tensor &src_im, core::Tensor &dst_im, const core::Tensor &kernel)
void Resize(const core::Tensor &src_im, core::Tensor &dst_im, Image::InterpType interp_type)
void RGBToGray(const core::Tensor &src_im, core::Tensor &dst_im)
void FilterGaussian(const core::Tensor &src_im, core::Tensor &dst_im, int kernel_size, float sigma)
void FilterSobel(const core::Tensor &src_im, core::Tensor &dst_im_dx, core::Tensor &dst_im_dy, int kernel_size)
Generic file read and write utility for python interface.