1#include "transformcommand.h"
2#include "opencv2/photo.hpp"
3#include <preprocessimage.hpp>
4#include <convertimage.hpp>
5#include <cvmatandqimage.h>
7TransformCommand::TransformCommand(
QImage image, Transformation trans,
const std::function<
void ()> &undo)
17 if(m_transform !=
nullptr)
19 return m_transform(image);
39 auto m_imgMat = QtOcv::image2Mat(ref);
40 auto newMat = PreprocessImage::grayscale(m_imgMat);
41 auto img = QtOcv::mat2Image(newMat);
47 auto m_imgMat = QtOcv::image2Mat(ref);
51 if(m_imgMat.channels() == 1)
53 cv::cvtColor(m_imgMat, m_imgMat, cv::COLOR_GRAY2BGR);
61 cv::stylization(m_imgMat, out);
63 auto img = QtOcv::mat2Image(out);
69 auto m_imgMat = QtOcv::image2Mat(ref);
72 cv::GaussianBlur(m_imgMat, out, cv::Size(), value);
74 auto img = QtOcv::mat2Image(out);
85 auto m_imgMat = QtOcv::image2Mat(ref);
86 auto newMat = PreprocessImage::adjustContrast(m_imgMat, value);
87 auto img = QtOcv::mat2Image(newMat);
90 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
100 else if(value < -255)
103 auto m_imgMat = QtOcv::image2Mat(ref);
104 auto newMat = PreprocessImage::adjustBrightness(m_imgMat, value);
105 auto img = QtOcv::mat2Image(newMat);
117 auto m_imgMat = QtOcv::image2Mat(ref);
118 auto newMat = PreprocessImage::adjustSaturation(m_imgMat, value);
120 auto img = QtOcv::mat2Image(newMat);
130 qDebug() <<
"Creating command for hue" << value;
132 auto m_imgMat = QtOcv::image2Mat(ref);
133 auto newMat = PreprocessImage::hue(m_imgMat, value);
134 auto img = QtOcv::mat2Image(newMat);
137 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
144 auto m_imgMat = QtOcv::image2Mat(ref);
145 auto newMat = PreprocessImage::gamma(m_imgMat, value);
146 auto img = QtOcv::mat2Image(newMat);
148 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
154 qDebug() <<
"Creating command for sharpness" << value;
156 auto m_imgMat = QtOcv::image2Mat(ref);
157 auto newMat = PreprocessImage::sharpness(m_imgMat, value);
158 auto img = QtOcv::mat2Image(newMat);
159 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
165 auto m_imgMat = QtOcv::image2Mat(ref);
166 auto newMat = PreprocessImage::manualThreshold(m_imgMat, value);
167 auto img = QtOcv::mat2Image(newMat);
168 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
172static double dist(cv::Point a, cv::Point b)
174 return sqrt(pow((
double) (a.x - b.x), 2) + pow((
double) (a.y - b.y), 2));
178static double getMaxDisFromCorners(
const cv::Size& imgSize,
const cv::Point& center)
183 std::vector<cv::Point> corners(4);
184 corners[0] = cv::Point(0, 0);
185 corners[1] = cv::Point(imgSize.width, 0);
186 corners[2] = cv::Point(0, imgSize.height);
187 corners[3] = cv::Point(imgSize.width, imgSize.height);
190 for (
int i = 0; i < 4; ++i)
192 double dis = dist(corners[i], center);
200static void generateGradient(cv::Mat& mask)
202 cv::Point firstPt = cv::Point(mask.size().width/2, mask.size().height/2);
206 double maxImageRad = radius * getMaxDisFromCorners(mask.size(), firstPt);
208 mask.setTo(cv::Scalar(1));
209 for (
int i = 0; i < mask.rows; i++)
211 for (
int j = 0; j < mask.cols; j++)
213 double temp = dist(firstPt, cv::Point(j, i)) / maxImageRad;
215 double temp_s = pow(cos(temp), 4);
216 mask.at<
double>(i, j) = temp_s;
223 auto mat = QtOcv::image2Mat(ref);
225 cv::Mat maskImg(mat.size(), CV_64F);
226 generateGradient(maskImg);
228 cv::Mat labImg(mat.size(), CV_8UC3);
229 cv::cvtColor(mat, labImg, cv::COLOR_BGR2Lab);
231 for (
int row = 0; row < labImg.size().height; row++)
233 for (
int col = 0; col < labImg.size().width; col++)
235 cv::Vec3b value = labImg.at<cv::Vec3b>(row, col);
236 value.val[0] *= maskImg.at<
double>(row, col);
237 labImg.at<cv::Vec3b>(row, col) = value;
242 cv::cvtColor(labImg, output, cv::COLOR_Lab2BGR);
243 auto img = QtOcv::mat2Image(output);
const QList< QKeySequence > & undo()