MauiKit Image Tools

transformcommand.cpp
1#include "transformcommand.h"
2#include "opencv2/photo.hpp"
3#include <preprocessimage.hpp>
4#include <convertimage.hpp>
5#include <cvmatandqimage.h>
6
7TransformCommand::TransformCommand(QImage image, Transformation trans, const std::function<void ()> &undo)
8 : m_image(image)
9 ,m_transform(trans)
10 ,m_cb(undo)
11{
12
13}
14
15QImage TransformCommand::redo(QImage image)
16{
17 if(m_transform != nullptr)
18 {
19 return m_transform(image);
20 }
21
22 return QImage{};
23}
24
25QImage TransformCommand::undo(QImage image)
26{
27 Q_UNUSED(image)
28
29 if(m_cb != nullptr)
30 {
31 m_cb();
32 }
33 return m_image;
34}
35
36
37QImage Trans::toGray(QImage &ref)
38{
39 auto m_imgMat = QtOcv::image2Mat(ref);
40 auto newMat = PreprocessImage::grayscale(m_imgMat);
41 auto img = QtOcv::mat2Image(newMat);
42 return img;
43}
44
45QImage Trans::sketch(QImage &ref)
46{
47 auto m_imgMat = QtOcv::image2Mat(ref);
48 cv::Mat out;
49 cv::Mat out2;
50
51 if(m_imgMat.channels() == 1)
52 {
53 cv::cvtColor(m_imgMat, m_imgMat, cv::COLOR_GRAY2BGR);
54 }
55
56 // cv::Mat im(m_imgMat);
57 // cv::GaussianBlur(m_imgMat, out, cv::Size(5,5), 0, 0);
58 // cv::pencilSketch(m_imgMat, out2, im, 10);
59 // cv::edgePreservingFilter(m_imgMat, out, cv::RECURS_FILTER);
60 // cv::detailEnhance(m_imgMat, out);
61 cv::stylization(m_imgMat, out);
62 //(Mat src, Mat dst, int flags=1, float sigma_s=60, float sigma_r=0.4f)
63 auto img = QtOcv::mat2Image(out);
64 return img;
65}
66
67QImage Trans::adjustGaussianBlur(QImage &ref, int value)
68{
69 auto m_imgMat = QtOcv::image2Mat(ref);
70 cv::Mat out;
71
72 cv::GaussianBlur(m_imgMat, out, cv::Size(), value);
73
74 auto img = QtOcv::mat2Image(out);
75 return img;
76}
77
78QImage Trans::adjustContrast(QImage &ref, int value)
79{
80 if(value > 100)
81 value = 100;
82 else if(value < -100)
83 value = -100;
84
85 auto m_imgMat = QtOcv::image2Mat(ref);
86 auto newMat = PreprocessImage::adjustContrast(m_imgMat, value);
87 auto img = QtOcv::mat2Image(newMat); //remember to delete
88 // qDebug() << "IS PROCESSED IMAGE VALIUD" << img.isNull() << img.format();
89
90 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
91
92 return img;
93}
94
95QImage Trans::adjustBrightness(QImage &ref, int value)
96{
97 if(value > 255)
98 value = 255;
99
100 else if(value < -255)
101 value = -255;
102
103 auto m_imgMat = QtOcv::image2Mat(ref);
104 auto newMat = PreprocessImage::adjustBrightness(m_imgMat, value);
105 auto img = QtOcv::mat2Image(newMat);
106 return img;
107}
108
109QImage Trans::adjustSaturation(QImage &ref, int value)
110{
111 if(value > 100)
112 value = 100;
113
114 if(value < -100)
115 value = -100;
116
117 auto m_imgMat = QtOcv::image2Mat(ref);
118 auto newMat = PreprocessImage::adjustSaturation(m_imgMat, value);
119
120 auto img = QtOcv::mat2Image(newMat);
121 return img;
122}
123
124QImage Trans::adjustHue(QImage &ref, int value)
125{
126 if(value > 180)
127 value = 180;
128 else if(value < 0)
129 value = 0;
130 qDebug() << "Creating command for hue" << value;
131
132 auto m_imgMat = QtOcv::image2Mat(ref);
133 auto newMat = PreprocessImage::hue(m_imgMat, value);
134 auto img = QtOcv::mat2Image(newMat); //remember to delete
135 // qDebug() << "IS PROCESSED IMAGE VALIUD" << img.isNull() << img.format();
136
137 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
138
139 return img;
140}
141
142QImage Trans::adjustGamma(QImage &ref, int value)
143{
144 auto m_imgMat = QtOcv::image2Mat(ref);
145 auto newMat = PreprocessImage::gamma(m_imgMat, value);
146 auto img = QtOcv::mat2Image(newMat);
147
148 qDebug() << m_imgMat.rows << m_imgMat.cols << m_imgMat.step << m_imgMat.empty();
149 return img;
150}
151
152QImage Trans::adjustSharpness(QImage &ref, int value)
153{
154 qDebug() << "Creating command for sharpness" << value;
155
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();
160 return img;
161}
162
163QImage Trans::adjustThreshold(QImage &ref, int value)
164{
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();
169 return img;
170}
171
172static double dist(cv::Point a, cv::Point b)
173{
174 return sqrt(pow((double) (a.x - b.x), 2) + pow((double) (a.y - b.y), 2));
175}
176
177// Helper function that computes the longest distance from the edge to the center point.
178static double getMaxDisFromCorners(const cv::Size& imgSize, const cv::Point& center)
179{
180 // given a rect and a line
181 // get which corner of rect is farthest from the line
182
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);
188
189 double maxDis = 0;
190 for (int i = 0; i < 4; ++i)
191 {
192 double dis = dist(corners[i], center);
193 if (maxDis < dis)
194 maxDis = dis;
195 }
196
197 return maxDis;
198}
199
200static void generateGradient(cv::Mat& mask)
201{
202 cv::Point firstPt = cv::Point(mask.size().width/2, mask.size().height/2);
203 double radius = 1.0;
204 double power = 0.8;
205
206 double maxImageRad = radius * getMaxDisFromCorners(mask.size(), firstPt);
207
208 mask.setTo(cv::Scalar(1));
209 for (int i = 0; i < mask.rows; i++)
210 {
211 for (int j = 0; j < mask.cols; j++)
212 {
213 double temp = dist(firstPt, cv::Point(j, i)) / maxImageRad;
214 temp = temp * power;
215 double temp_s = pow(cos(temp), 4);
216 mask.at<double>(i, j) = temp_s;
217 }
218 }
219}
220
221QImage Trans::vignette(QImage &ref)
222{
223 auto mat = QtOcv::image2Mat(ref);
224
225 cv::Mat maskImg(mat.size(), CV_64F);
226 generateGradient(maskImg);
227
228 cv::Mat labImg(mat.size(), CV_8UC3);
229 cv::cvtColor(mat, labImg, cv::COLOR_BGR2Lab);
230
231 for (int row = 0; row < labImg.size().height; row++)
232 {
233 for (int col = 0; col < labImg.size().width; col++)
234 {
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;
238 }
239 }
240
241 cv::Mat output;
242 cv::cvtColor(labImg, output, cv::COLOR_Lab2BGR);
243 auto img = QtOcv::mat2Image(output);
244 return img;
245}
const QList< QKeySequence > & undo()
This file is part of the KDE documentation.
Documentation copyright © 1996-2025 The KDE developers.
Generated on Fri Apr 25 2025 11:51:53 by doxygen 1.13.2 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.