1 #ifndef flexSuperpixelOperator_H 2 #define flexSuperpixelOperator_H 5 #include "flexLinearOperator.h" 16 typedef thrust::device_vector<T> Tdata;
18 typedef std::vector<T> Tdata;
22 std::vector<int> targetDimension;
32 flexSuperpixelOperator(std::vector<int> aTargetDimension, T aUpsamplingFactor,
bool aMinus) :
flexLinearOperator<T>((int)(vectorProduct(aTargetDimension)), (int)(vectorProduct(aTargetDimension)*aUpsamplingFactor*aUpsamplingFactor), superpixelOp, aMinus)
34 this->targetDimension.resize(aTargetDimension.size());
35 this->targetDimension = aTargetDimension;
36 this->upsamplingFactor = aUpsamplingFactor;
47 void times(
bool transposed,
const Tdata &input, Tdata &output)
52 void timesPlus(
bool transposed,
const Tdata &input, Tdata &output)
56 doTimes(transposed,input,output, MINUS);
60 doTimes(transposed,input,output, PLUS);
64 void timesMinus(
bool transposed,
const Tdata &input, Tdata &output)
68 doTimes(transposed,input,output, PLUS);
72 doTimes(transposed,input,output, MINUS);
80 return std::vector<T>(this->
getNumCols(), (T)1 / (T)(this->upsamplingFactor*this->upsamplingFactor));
84 return std::vector<T>(this->
getNumRows(), (T)1);
92 return (T)1 / (T)(this->upsamplingFactor*this->upsamplingFactor);
110 int indexI(
int index,
int sizeX)
112 return index % sizeX;
115 int indexJ(
int index,
int sizeX,
int sizeY)
117 return (index / sizeX) % sizeY;
120 int index2DtoLinear(
int i,
int j,
int sizeY)
122 return (i*sizeY + j);
125 void calcTimes(
const Tdata &input, Tdata &output,
mySign signRule)
128 T factor = (T)1 / (this->upsamplingFactor*this->upsamplingFactor);
130 int iOuterEnd = targetDimension[0];
131 int jOuterEnd = targetDimension[1];
133 int sizeY = targetDimension[1] * (int)this->upsamplingFactor;
135 #pragma omp parallel for 136 for (
int i = 0; i < iOuterEnd; ++i)
138 for (
int j = 0; j < jOuterEnd; ++j)
142 int outputIndex = index2DtoLinear(i, j, targetDimension[1]);
144 int iInnerStart = i*(int)this->upsamplingFactor;
145 int iInnerEnd = (i + 1)*(
int)this->upsamplingFactor;
147 int jInnerStart = j*(int)this->upsamplingFactor;
148 int jInnerEnd = (j + 1)*(
int)this->upsamplingFactor;
152 for (
int iInner = iInnerStart; iInner < iInnerEnd; ++iInner)
154 for (
int jInner = jInnerStart; jInner < jInnerEnd; ++jInner)
156 int inputIndex = index2DtoLinear(iInner, jInner, sizeY);
158 tmpResult += input[inputIndex];
182 output[outputIndex] += factor*tmpResult;
187 output[outputIndex] -= factor*tmpResult;
192 output[outputIndex] = factor*tmpResult;
200 void calcTimesTransposed(
const Tdata &input, Tdata &output,
mySign signRule)
202 T factor = (T)1 / (this->upsamplingFactor*this->upsamplingFactor);
204 int sizeX = targetDimension[0] * (int)this->upsamplingFactor;
205 int sizeY = targetDimension[1] * (int)this->upsamplingFactor;
207 #pragma omp parallel for 208 for (
int i = 0; i < sizeX; ++i)
210 for (
int j = 0; j < sizeY; ++j)
212 int inputIndex = index2DtoLinear(i, j, sizeY);
219 int backI = i / (int)this->upsamplingFactor;
220 int backJ = j / (int)this->upsamplingFactor;
223 int outputIndex = index2DtoLinear(backI, backJ, targetDimension[1]);
231 output[inputIndex] += factor*input[outputIndex];
236 output[inputIndex] -= factor*input[outputIndex];
241 output[inputIndex] = factor*input[outputIndex];
249 void doTimes(
bool transposed,
const Tdata &input, Tdata &output,
mySign signRule)
253 calcTimesTransposed(input, output, signRule);
257 calcTimes(input, output, signRule);
flexSuperpixelOperator(std::vector< int > aTargetDimension, T aUpsamplingFactor, bool aMinus)
initializes the superpixel operator. Downsamples image of size aUpsamplingFactor * aTargetDimension t...
Definition: flexSuperpixelOperator.h:32
int getNumRows() const
returns number of rows of the linear operator
Definition: flexLinearOperator.h:57
void timesMinus(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector and substracts its result from y
Definition: flexSuperpixelOperator.h:64
flexSuperpixelOperator< T > * copy()
copies the linear operator
Definition: flexSuperpixelOperator.h:39
bool isMinus
determines if operator is negated
Definition: flexLinearOperator.h:25
int getNumCols() const
returns number of columns of the linear operator
Definition: flexLinearOperator.h:48
thrust::device_vector< T > getAbsRowSumCUDA(bool transposed)
same function as getAbsRowSum() but implemented in CUDA
Definition: flexSuperpixelOperator.h:101
std::vector< T > getAbsRowSum(bool transposed)
returns a vector of sum of absolute values per row used for preconditioning
Definition: flexSuperpixelOperator.h:76
void times(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector
Definition: flexSuperpixelOperator.h:47
void timesPlus(bool transposed, const Tdata &input, Tdata &output)
applies linear operator on vector and adds its result to y
Definition: flexSuperpixelOperator.h:52
abstract base class for linear operators
Definition: flexLinearOperator.h:12
T getMaxRowSumAbs(bool transposed)
returns the maximum sum of absolute values per row used for preconditioning
Definition: flexSuperpixelOperator.h:88
represents a superpixel operator
Definition: flexSuperpixelOperator.h:12