示例#1
0
void ShearTool::setPreviewImage()
{
    ImageIface* const iface = d->previewWidget->imageIface();
    int w                   = iface->previewSize().width();
    int h                   = iface->previewSize().height();
    DImg imTemp             = filter()->getTargetImage().smoothScale(w, h, Qt::KeepAspectRatio);
    DImg imDest( w, h, filter()->getTargetImage().sixteenBit(), filter()->getTargetImage().hasAlpha() );

    imDest.fill( DColor(d->previewWidget->palette().color(QPalette::Background).rgb(),
                        filter()->getTargetImage().sixteenBit()) );
    imDest.bitBltImage(&imTemp, (w-imTemp.width())/2, (h-imTemp.height())/2);

    iface->setPreview(imDest.smoothScale(iface->previewSize()));

    d->previewWidget->updatePreview();

    ShearFilter* const tool = dynamic_cast<ShearFilter*>(filter());

    if (tool)
    {
        QSize newSize = tool->getNewSize();
        QString temp;
        d->newWidthLabel->setText(temp.setNum( newSize.width())   + i18n(" px") );
        d->newHeightLabel->setText(temp.setNum( newSize.height()) + i18n(" px") );
    }
}
示例#2
0
void NormalRadonTransform::radon(const cv::Mat& src, cv::Mat& dest)
{
		float  alpha, beta, sum, rho;
		float  dx, cos_t, sin_t, r_offset, x_min;
		int w = src.rows;
		int h = src.cols;
		int T = 180;
		int R = sqrt(h * h + w * w);
		dx = 0.5f;
		x_min = -(h - 1.0) / 2 * dx;
		float thr = 1 / sqrt(2);
		cv::Mat_<uchar> imSrc = src;
		dest.create(T, R, src.type());
		cv::Mat_<uchar> imDest = dest;
		for (int t = 0; t < T; t++)
		{
			float theta = t * CV_PI / 180;
			cos_t = cos(theta);
			sin_t = sin(theta);
			r_offset = x_min * (cos_t + sin_t);

			if (sin_t > thr)
			{
				alpha = -cos_t / sin_t;

				for (int r = 0; r < R; r++)
				{
					rho = r - (R - 1.0) / 2;
					beta = (rho / 2 - r_offset) / (dx * sin_t);
					sum = 0;

					for (int i = 0; i < h; i++)
					{
						int j = (int)(alpha * i + beta);
						if (j >= 0 && j < w)
						{
							sum += imSrc(i, j);
						}
					}
					imDest(t, r) = sum * dx / (sin_t * 100);
				}//for r
			}//for if

			else
			{
				alpha = -sin_t / cos_t;

				for (int r = 0; r < R; r++)
				{
					rho = r - (R - 1.0) / 2;
					beta = (rho / 2 - r_offset) / (dx * cos_t);
					sum = 0;

					for (int j = 0; j < w; j++)
					{
						int i = (int)(alpha * j + beta);
						if (i >= 0 && i < h)
						{
							sum += imSrc(i, j);
						}
					}
					//rad[t * R + r] = sum * dx / fabsf(cos_t);
					imDest(t, r) = sum * dx / (fabsf(cos_t) * 100);
				}//for r
			}//for else
		}//for t
		dest = dest.t();
}