1#include "transformcommand.h"
2#include "opencv2/photo.hpp"
3#include <preprocessimage.hpp>
4#include <convertimage.hpp>
5#include <cvmatandqimage.h>
6#include "opencv2/highgui.hpp"
8TransformCommand::TransformCommand(
QImage image, Transformation trans,
const std::function<
void ()> &undo)
18 if(m_transform !=
nullptr)
20 return m_transform(image);
40 auto m_imgMat = QtOcv::image2Mat(ref);
41 auto newMat = PreprocessImage::grayscale(m_imgMat);
42 auto img = QtOcv::mat2Image(newMat);
48 auto m_imgMat = QtOcv::image2Mat(ref);
50 if(m_imgMat.channels() == 1)
52 cv::cvtColor(m_imgMat, m_imgMat, cv::COLOR_GRAY2BGR);
54 cv::Mat image = cv::imread(
"/home/camilo/Downloads/uis/fm/filemagic_1x.png");
56 std::cout <<
"Could not open or find the image!" << std::endl;
59 cv::Mat graySketch, colorSketch, out;
63 float sigma_r = 0.07f;
64 float shade_factor = 0.02f;
67 cv::pencilSketch(m_imgMat, graySketch, colorSketch, sigma_s, sigma_r, shade_factor);
70 imshow(
"Original Image", m_imgMat);
71 imshow(
"Pencil Sketch - Grayscale", graySketch);
72 imshow(
"Pencil Sketch - Color", colorSketch);
106 auto m_imgMat = QtOcv::image2Mat(ref);
109 cv::GaussianBlur(m_imgMat, out, cv::Size(), value);
111 auto img = QtOcv::mat2Image(out);
119 else if(value < -100)
122 auto m_imgMat = QtOcv::image2Mat(ref);
123 auto newMat = PreprocessImage::adjustContrast(m_imgMat, value);
124 auto img = QtOcv::mat2Image(newMat);
127 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
137 else if(value < -255)
140 auto m_imgMat = QtOcv::image2Mat(ref);
141 auto newMat = PreprocessImage::adjustBrightness(m_imgMat, value);
142 auto img = QtOcv::mat2Image(newMat);
154 auto m_imgMat = QtOcv::image2Mat(ref);
155 auto newMat = PreprocessImage::adjustSaturation(m_imgMat, value);
157 auto img = QtOcv::mat2Image(newMat);
167 qDebug() <<
"Creating command for hue" << value;
169 auto m_imgMat = QtOcv::image2Mat(ref);
170 auto newMat = PreprocessImage::hue(m_imgMat, value);
171 auto img = QtOcv::mat2Image(newMat);
174 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
181 auto m_imgMat = QtOcv::image2Mat(ref);
182 auto newMat = PreprocessImage::gamma(m_imgMat, value);
183 auto img = QtOcv::mat2Image(newMat);
185 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
191 qDebug() <<
"Creating command for sharpness" << value;
193 auto m_imgMat = QtOcv::image2Mat(ref);
194 auto newMat = PreprocessImage::sharpness(m_imgMat, value);
195 auto img = QtOcv::mat2Image(newMat);
196 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
202 auto m_imgMat = QtOcv::image2Mat(ref);
203 auto newMat = PreprocessImage::manualThreshold(m_imgMat, value);
204 auto img = QtOcv::mat2Image(newMat);
205 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
209static double dist(cv::Point a, cv::Point b)
211 return sqrt(pow((
double) (a.x - b.x), 2) + pow((
double) (a.y - b.y), 2));
215static double getMaxDisFromCorners(
const cv::Size& imgSize,
const cv::Point& center)
220 std::vector<cv::Point> corners(4);
221 corners[0] = cv::Point(0, 0);
222 corners[1] = cv::Point(imgSize.width, 0);
223 corners[2] = cv::Point(0, imgSize.height);
224 corners[3] = cv::Point(imgSize.width, imgSize.height);
227 for (
int i = 0; i < 4; ++i)
229 double dis = dist(corners[i], center);
237static void generateGradient(cv::Mat& mask)
239 cv::Point firstPt = cv::Point(mask.size().width/2, mask.size().height/2);
243 double maxImageRad = radius * getMaxDisFromCorners(mask.size(), firstPt);
245 mask.setTo(cv::Scalar(1));
246 for (
int i = 0; i < mask.rows; i++)
248 for (
int j = 0; j < mask.cols; j++)
250 double temp = dist(firstPt, cv::Point(j, i)) / maxImageRad;
252 double temp_s = pow(cos(temp), 4);
253 mask.at<
double>(i, j) = temp_s;
260 auto mat = QtOcv::image2Mat(ref);
262 cv::Mat maskImg(mat.size(), CV_64F);
263 generateGradient(maskImg);
265 cv::Mat labImg(mat.size(), CV_8UC3);
266 cv::cvtColor(mat, labImg, cv::COLOR_BGR2Lab);
268 for (
int row = 0; row < labImg.size().height; row++)
270 for (
int col = 0; col < labImg.size().width; col++)
272 cv::Vec3b value = labImg.at<cv::Vec3b>(row, col);
273 value.val[0] *= maskImg.at<
double>(row, col);
274 labImg.at<cv::Vec3b>(row, col) = value;
279 cv::cvtColor(labImg, output, cv::COLOR_Lab2BGR);
280 auto img = QtOcv::mat2Image(output);
286 auto mat = QtOcv::image2Mat(ref);
287 cv::Mat output, out2;
291 int top = (int)thickness;;
int bottom = top;
293 cv::Scalar value(color.
red(), color.
green(), color.
blue());
295 cv::cvtColor(mat, mat, cv::COLOR_RGB2BGR);
296 copyMakeBorder(mat, output, top, bottom, left, right, cv::BORDER_CONSTANT, value);
297 cv::cvtColor(output, output, cv::COLOR_BGR2RGB);
299 auto img = QtOcv::mat2Image(output);
305 auto mat = QtOcv::image2Mat(ref);
308 cv::Mat grayImage, res;
309 cv::cvtColor(mat, grayImage, cv::COLOR_BGR2GRAY);
324 cv::Mat adjustedImage;
325 grayImage.convertTo(adjustedImage, -1, alpha, beta);
331 cv::cvtColor(adjustedImage, adjustedImage, cv::COLOR_GRAY2RGB);
334 auto img = QtOcv::mat2Image(adjustedImage);
const QList< QKeySequence > & undo()
QTextStream & left(QTextStream &stream)
QTextStream & right(QTextStream &stream)