コード例 #1
0
IntensityMap GaussianBlur::calculate(IntensityMap &input, double radius, bool tileable) {
    IntensityMap result = IntensityMap(input.getWidth(), input.getHeight());

    gaussBlur(input, result, radius, tileable);

    return result;
}
コード例 #2
0
//the displacement map is generated with the specularmapGenerator (similar controls and output needed)
void MainWindow::calcDisplace() {
    if(input.isNull())
        return;

    //color channel mode
    IntensityMap::Mode mode = IntensityMap::AVERAGE;
    if(ui->comboBox_mode_displace->currentIndex() == 0)
        mode = IntensityMap::AVERAGE;
    else if(ui->comboBox_mode_displace->currentIndex() == 1)
        mode = IntensityMap::MAX;

    //color channel multipliers to use
    double redMultiplier = ui->doubleSpinBox_displace_redMul->value();
    double greenMultiplier = ui->doubleSpinBox_displace_greenMul->value();
    double blueMultiplier = ui->doubleSpinBox_displace_blueMul->value();
    double alphaMultiplier = 0.0;
    double scale = ui->doubleSpinBox_displace_scale->value();
    double contrast = ui->doubleSpinBox_displace_contrast->value();

    //setup generator and calculate map
    SpecularmapGenerator specularmapGenerator(mode, redMultiplier, greenMultiplier, blueMultiplier, alphaMultiplier);
    displacementmap = specularmapGenerator.calculateSpecmap(input, scale, contrast);

    if(ui->checkBox_displace_blur->isChecked()) {
        int radius = ui->spinBox_displace_blurRadius->value();
        bool tileable = ui->checkBox_displace_blur_tileable->isChecked();

        IntensityMap inputMap(displacementmap, IntensityMap::AVERAGE);
        BoxBlur filter;
        IntensityMap outputMap = filter.calculate(inputMap, radius, tileable);
        displacementmap = outputMap.convertToQImage();
    }
}
コード例 #3
0
void GaussianBlur::boxBlur(IntensityMap &input, IntensityMap &result, double radius, bool tileable) {
    for(size_t i = 0; i < input.getWidth() * input.getHeight(); i++) {
        result.setValue(i, input.at(i));
    }

    boxBlurH(result, input, radius, tileable);
    boxBlurT(input, result, radius, tileable);
}
コード例 #4
0
//displays single color channels of the image (handled by an intensitymap)
void MainWindow::displayChannelIntensity() {
    if(input.isNull())
        return;

    IntensityMap temp;
    if(ui->radioButton_displayRed->isChecked())
        temp = IntensityMap(input, IntensityMap::AVERAGE, true, false, false, false);
    else if(ui->radioButton_displayGreen->isChecked())
        temp = IntensityMap(input, IntensityMap::AVERAGE, false, true, false, false);
    else if(ui->radioButton_displayBlue->isChecked())
        temp = IntensityMap(input, IntensityMap::AVERAGE, false, false, true, false);
    else
        temp = IntensityMap(input, IntensityMap::AVERAGE, false, false, false, true);

    this->channelIntensity = temp.convertToQImage();
    preview(0);
}
コード例 #5
0
void GaussianBlur::boxBlurT(IntensityMap &input, IntensityMap &result, double radius, bool tileable) {
    const int width = input.getWidth();
    const int height = input.getHeight();

    #pragma omp parallel for  // OpenMP
    for(int i = 0; i < height; i++) {
        for(int j = 0; j < width; j++) {
            double val = 0.0;

            for(int iy = i - radius; iy < i + radius + 1; iy++) {
                const int y = handleEdges(iy, height, tileable);
                val += input.at(j, y);
            }

            result.setValue(j, i, val / (radius + radius + 1));
        }
    }
}
コード例 #6
0
ファイル: basic_classes.cpp プロジェクト: JacobCWard/Yell
void add_pair_to_appropriate_place(IntensityMap &  small_piece,IntensityMap & accumulator,vec3<int> r,vector<bool> periodic) {
	vec3<int> piece_size=small_piece.size();
	vec3<int> acc_size=accumulator.size();
	
	r=r-(piece_size/2);
	
	vec3<int> borders;
	for(int i=0; i<3; i++)
	{
		borders[i]=0;//(acc_size[i]>1);
	}

	vec3<int> llimits, ulimits;
  for(int i=0; i<3; ++i)
  {
    llimits[i]=r[i];
    ulimits[i]=r[i]+piece_size[i]+borders[i];

    
    if(!periodic.at(i))
    {
      llimits[i]=max(0,llimits[i]);
      ulimits[i]=min(acc_size[i],ulimits[i]);
    }
  }
	
	for(int i=llimits[0];i<ulimits[0]; i++)
	{
		int is=(i-r[0])%piece_size[0];
		for(int j=llimits[1];j<ulimits[1]; j++)
		{
			int js=(j-r[1])%piece_size[1];
			for(int k=llimits[2];k<ulimits[2]; k++)
			{
				int ks=(k-r[2])%piece_size[2];
				accumulator.at((i+acc_size[0])%acc_size[0],
                       (j+acc_size[1])%acc_size[1],
                       (k+acc_size[2])%acc_size[2])+=small_piece.at(is,js,ks);
			}
		}
	}
}
コード例 #7
0
osg::Image* readIntensityImage(osgDB::Input &fr, bool &itrAdvanced)
{
    if (fr.matchSequence("intensityMap {"))
    {
        int entry = fr[0].getNoNestedBrackets();
        fr += 2;

        typedef std::map<float, float> IntensityMap;
        IntensityMap intensityMap;

        while (!fr.eof() && fr[0].getNoNestedBrackets() > entry)
        {
            float position, intensity;
            if (fr.read(position, intensity))
            {
                intensityMap[position] = intensity;
            }
            else
            {
                ++fr;
            }
        }

        ++fr;

        itrAdvanced = true;

        if (!intensityMap.empty())
        {
            unsigned int numPixels = 256;

            osg::Image *image = new osg::Image;
            image->allocateImage(1, numPixels, 1, GL_LUMINANCE, GL_FLOAT);

            float intensityMultiplier = 0.01f;
            float *ptr                = reinterpret_cast<float*>(image->data());

            for (unsigned int i = 0; i < numPixels; ++i)
            {
                float position  = (1.0f - float(i) / float(numPixels - 1)) * 180.0f;
                float intensity = 1.0f;
                if (position <= intensityMap.begin()->first)
                {
                    intensity = intensityMap.begin()->second * intensityMultiplier;
                }
                else if (position >= intensityMap.rbegin()->first)
                {
                    intensity = intensityMap.rbegin()->second * intensityMultiplier;
                }
                else
                {
                    IntensityMap::iterator above_itr = intensityMap.lower_bound(position);
                    if (above_itr != intensityMap.begin())
                    {
                        IntensityMap::iterator below_itr = above_itr;
                        --below_itr;
                        float r = (position - below_itr->first) / (above_itr->first - below_itr->first);
                        intensity = (below_itr->second + (above_itr->second - below_itr->second) * r) * intensityMultiplier;
                    }
                    else
                    {
                        intensity = above_itr->second * intensityMultiplier;
                    }
                }

                *ptr++ = intensity;
            }

            return image;
        }
    }

    return 0;
}