SHOW:
|
|
- or go back to the newest paste.
1 | #include <imgproc.hpp> | |
2 | #include <highgui.hpp> | |
3 | #include <iostream> | |
4 | #include <cmath> | |
5 | #include "windows.h" | |
6 | ||
7 | cv::Mat img = cv::imread("X:/Visual Studio/Images/clintsmall.jpg"); | |
8 | ||
9 | void bin_er (const cv::Mat& input_img, cv::Mat& output_img) { | |
10 | output_img = input_img.clone(); | |
11 | for (int i = 1; i < input_img.rows - 1; i++) | |
12 | for (int j = 1; j < input_img.cols - 1; j++) { | |
13 | int cnt = 0; | |
14 | for (int ii = -1; ii <= 1; ii++) | |
15 | for (int jj = -1; jj <= 1; jj++) { | |
16 | if (input_img.at<uchar>(i - ii, j - jj) == 0) | |
17 | cnt++; | |
18 | } | |
19 | if (cnt > 0) | |
20 | output_img.at<uchar>(i, j) = 0; | |
21 | } | |
22 | } | |
23 | ||
24 | void bin_dil (const cv::Mat& input_img, cv::Mat& output_img) { | |
25 | output_img = input_img.clone(); | |
26 | for (int i = 1; i < input_img.rows - 1; i++) | |
27 | for (int j = 1; j < input_img.cols - 1; j++) { | |
28 | int cnt = 0; | |
29 | for (int ii = -1; ii <= 1; ii++) | |
30 | for (int jj = -1; jj <= 1; jj++) { | |
31 | if (input_img.at<uchar>(i - ii, j - jj) == 255) | |
32 | cnt++; | |
33 | } | |
34 | if (cnt > 0) | |
35 | output_img.at<uchar>(i, j) = 255; | |
36 | } | |
37 | } | |
38 | ||
39 | void ht_er (const cv::Mat& input_img, cv::Mat& output_img) { | |
40 | output_img = cv::Mat::zeros(input_img.size(), CV_8U); | |
41 | for (int i = 1; i < input_img.rows - 1; i++) | |
42 | for (int j = 1; j < input_img.cols - 1; j++) { | |
43 | float min = 255; | |
44 | uchar pix_value = input_img.at<uchar>(i, j); | |
45 | for (int ii = -1; ii <= 1; ii++) | |
46 | for (int jj = -1; jj <= 1; jj++) { | |
47 | uchar Y = input_img.at<uchar>(i - ii, j - jj); | |
48 | if (Y < min) min = Y; | |
49 | } | |
50 | output_img.at<uchar>(i, j) = min; | |
51 | } | |
52 | } | |
53 | ||
54 | void ht_dil (const cv::Mat& input_img, cv::Mat& output_img) { | |
55 | output_img = cv::Mat::zeros(input_img.size(), CV_8U); | |
56 | for (int i = 1; i < input_img.rows - 1; i++) | |
57 | for (int j = 1; j < input_img.cols - 1; j++) { | |
58 | float max = 0; | |
59 | uchar pix_value = input_img.at<uchar>(i, j); | |
60 | for (int ii = -1; ii <= 1; ii++) | |
61 | for (int jj = -1; jj <= 1; jj++) { | |
62 | uchar Y = input_img.at<uchar>(i - ii, j - jj); | |
63 | if (Y > max) max = Y; | |
64 | } | |
65 | output_img.at<uchar>(i, j) = max; | |
66 | } | |
67 | } | |
68 | ||
69 | void fcontour(const cv::Mat& input_img, cv::Mat& output_img, int n) { | |
70 | int cycle = 0; | |
71 | output_img = cv::Mat::zeros(input_img.size(), CV_8U); | |
72 | cv::Mat prep = input_img.clone(); | |
73 | while (cycle < n) { | |
74 | for (int i = 1; i < prep.rows - 1; i++) | |
75 | for (int j = 1; j < prep.cols - 1; j++) { | |
76 | float min = 255; | |
77 | uchar pix_value = prep.at<uchar>(i, j); | |
78 | for (int ii = -1; ii <= 1; ii++) | |
79 | for (int jj = -1; jj <= 1; jj++) { | |
80 | uchar Y = prep.at<uchar>(i - ii, j - jj); | |
81 | if (Y < min) min = Y; | |
82 | } | |
83 | output_img.at<uchar>(i, j) = min; | |
84 | } | |
85 | prep = output_img.clone(); | |
86 | cycle++; | |
87 | } | |
88 | cv::subtract(input_img, prep, output_img); | |
89 | } | |
90 | ||
91 | void fcontoursym(const cv::Mat& input_img, cv::Mat& output_img, int n) { | |
92 | int cycle = 0; | |
93 | cv::Mat res_1 = cv::Mat::zeros(input_img.size(), CV_8U); | |
94 | cv::Mat prep1 = input_img.clone(); | |
95 | ||
96 | while (cycle < n) { | |
97 | for (int i = 1; i < prep1.rows - 1; i++) | |
98 | for (int j = 1; j < prep1.cols - 1; j++) { | |
99 | float min = 255; | |
100 | uchar pix_value = prep1.at<uchar>(i, j); | |
101 | for (int ii = -1; ii <= 1; ii++) | |
102 | for (int jj = -1; jj <= 1; jj++) { | |
103 | uchar Y = prep1.at<uchar>(i - ii, j - jj); | |
104 | if (Y < min) min = Y; | |
105 | } | |
106 | res_1.at<uchar>(i, j) = min; | |
107 | } | |
108 | prep1 = res_1.clone(); | |
109 | cycle++; | |
110 | } | |
111 | ||
112 | cycle = 0; | |
113 | cv::Mat res_2 = cv::Mat::zeros(input_img.size(), CV_8U); | |
114 | cv::Mat prep2 = input_img.clone(); | |
115 | ||
116 | while (cycle < n) { | |
117 | for (int i = 1; i < prep2.rows - 1; i++) | |
118 | for (int j = 1; j < prep2.cols - 1; j++) { | |
119 | float max = 0; | |
120 | uchar pix_value = prep2.at<uchar>(i, j); | |
121 | for (int ii = -1; ii <= 1; ii++) | |
122 | for (int jj = -1; jj <= 1; jj++) { | |
123 | uchar Y = prep2.at<uchar>(i - ii, j - jj); | |
124 | if (Y > max) max = Y; | |
125 | } | |
126 | res_2.at<uchar>(i, j) = max; | |
127 | } | |
128 | prep2 = res_2.clone(); | |
129 | cycle++; | |
130 | } | |
131 | ||
132 | cv::subtract(prep2, prep1, output_img); | |
133 | } | |
134 | ||
135 | void morph(const cv::Mat& input_img, cv::Mat output_img) { | |
136 | cv::Mat prep1 = cv::Mat::zeros(input_img.size(), CV_8U); | |
137 | for (int i = 1; i < input_img.cols - 1; i++) | |
138 | for (int j = 1; j < input_img.rows - 1; j++) { | |
139 | float max = 0; | |
140 | float min = 255; | |
141 | for (int ii = -1; ii <= 1; ii++) | |
142 | for (int jj = -1; jj <= 1; jj++) { | |
143 | uchar Y_min = input_img.at<uchar>(j + jj, i + ii); | |
144 | uchar Y_max = input_img.at<uchar>(j + jj, i + ii); | |
145 | ||
146 | if (Y_max > max) | |
147 | max = Y_max; | |
148 | ||
149 | if (Y_min < min) | |
150 | min = Y_min; | |
151 | } | |
152 | prep1.at<uchar>(j, i) = (max - min); | |
153 | } | |
154 | ||
155 | cv::Mat prep2 = cv::Mat::zeros(input_img.size(), CV_8U); | |
156 | for (int i = 2; i < input_img.cols - 2; i++) | |
157 | for (int j = 2; j < input_img.rows - 2; j++) { | |
158 | float max = 0; | |
159 | float min = 255; | |
160 | for (int ii = -2; ii <= 2; ii++) | |
161 | for (int jj = -2; jj <= 2; jj++) { | |
162 | uchar Y_min = input_img.at<uchar>(j + jj, i + ii); | |
163 | uchar Y_max = input_img.at<uchar>(j + jj, i + ii); | |
164 | ||
165 | if (Y_max > max) | |
166 | max = Y_max; | |
167 | ||
168 | if (Y_min < min) | |
169 | min = Y_min; | |
170 | } | |
171 | prep2.at<uchar>(j, i) = (max - min); | |
172 | } | |
173 | cv::Mat prep21 = cv::Mat::zeros(prep2.size(), CV_8U); | |
174 | for (int i = 1; i < prep2.cols - 1; i++) | |
175 | for (int j = 1; j < prep2.rows - 1; j++) { | |
176 | float min = 255; | |
177 | for (int ii = -1; ii <= 1; ii++) | |
178 | for (int jj = -1; jj <= 1; jj++) { | |
179 | uchar Y = prep2.at<uchar>(j + jj, i + ii); | |
180 | if (Y < min) | |
181 | min = Y; | |
182 | } | |
183 | prep21.at<uchar>(j, i) = min; | |
184 | } | |
185 | ||
186 | cv::Mat prep3 = cv::Mat::zeros(input_img.size(), CV_8U); | |
187 | for (int i = 3; i < input_img.cols - 3; i++) | |
188 | for (int j = 3; j < input_img.rows - 3; j++) { | |
189 | float max = 0; | |
190 | float min = 255; | |
191 | for (int ii = -3; ii <= 3; ii++) | |
192 | for (int jj = -3; jj <= 3; jj++) { | |
193 | uchar Y_min = input_img.at<uchar>(j + jj, i + ii); | |
194 | uchar Y_max = input_img.at<uchar>(j + jj, i + ii); | |
195 | ||
196 | if (Y_max > max) | |
197 | max = Y_max; | |
198 | ||
199 | if (Y_min < min) | |
200 | min = Y_min; | |
201 | } | |
202 | prep3.at<uchar>(j, i) = (max - min); | |
203 | } | |
204 | ||
205 | cv::Mat prep31 = cv::Mat::zeros(prep3.size(), CV_8U); | |
206 | for (int i = 2; i < prep3.cols - 2; i++) | |
207 | for (int j = 2; j < prep3.rows - 2; j++) { | |
208 | float min = 255; | |
209 | for (int ii = -2; ii <= 2; ii++) | |
210 | for (int jj = -2; jj <= 2; jj++) { | |
211 | uchar Y = prep3.at<uchar>(j + jj, i + ii); | |
212 | if (Y < min) | |
213 | min = Y; | |
214 | } | |
215 | prep31.at<uchar>(j, i) = min; | |
216 | } | |
217 | ||
218 | cv::Mat prep1f; | |
219 | prep1.convertTo(prep1f, CV_64F); | |
220 | cv::Mat prep2f; | |
221 | prep21.convertTo(prep2f, CV_64F); | |
222 | cv::Mat prep3f; | |
223 | prep31.convertTo(prep3f, CV_64F); | |
224 | cv::Mat SUM; | |
225 | SUM = prep1f + prep2f + prep3f; | |
226 | SUM = SUM / 3; | |
227 | SUM.convertTo(output_img, CV_8U); | |
228 | } | |
229 | ||
230 | int main() { | |
231 | cv::Mat htimg = cv::Mat::zeros(img.size(), CV_8UC1); | |
232 | cv::Mat binimg = cv::Mat::zeros(img.size(), CV_8UC1); | |
233 | ||
234 | cv::Mat bineroded = cv::Mat::zeros(img.size(), CV_8UC1); | |
235 | cv::Mat bindilated = cv::Mat::zeros(img.size(), CV_8UC1); | |
236 | cv::Mat binopened = cv::Mat::zeros(img.size(), CV_8UC1); | |
237 | cv::Mat binclosed = cv::Mat::zeros(img.size(), CV_8UC1); | |
238 | ||
239 | cv::Mat hteroded = cv::Mat::zeros(img.size(), CV_8UC1); | |
240 | cv::Mat htdilated = cv::Mat::zeros(img.size(), CV_8UC1); | |
241 | cv::Mat htopened = cv::Mat::zeros(img.size(), CV_8UC1); | |
242 | cv::Mat htclosed = cv::Mat::zeros(img.size(), CV_8UC1); | |
243 | cv::Mat htcontours = cv::Mat::zeros(img.size(), CV_8UC1); | |
244 | cv::Mat htcontourssym = cv::Mat::zeros(img.size(), CV_8UC1); | |
245 | cv::Mat htmorphed = cv::Mat::zeros(img.size(), CV_8UC1); | |
246 | ||
247 | int N = 3; | |
248 | ||
249 | for (int i = 0; i < img.rows; i++) | |
250 | for (int j = 0; j < img.cols; j++) { | |
251 | htimg.at<uchar>(i, j) = 0.11 * img.at<cv::Vec3b>(i, j)[0] + 0.53 * img.at<cv::Vec3b>(i, j)[1] + 0.36 * img.at<cv::Vec3b>(i, j)[2]; | |
252 | } | |
253 | ||
254 | cv::imshow ("Полутоновое изображение", htimg); | |
255 | ||
256 | for (int i = 0; i < binimg.rows; i++) | |
257 | for (int j = 0; j < binimg.cols; j++) { | |
258 | if (htimg.at<uchar>(i, j) > 125) | |
259 | binimg.at<uchar>(i, j) = 255; | |
260 | else binimg.at<uchar>(i, j) = 0; | |
261 | } | |
262 | ||
263 | cv::imshow("Бинарное изображение", binimg); | |
264 | cv::waitKey(); | |
265 | ||
266 | fcontour(htimg, htcontours, N); | |
267 | cv::imshow("Поиск контуров", htcontours); | |
268 | cv::waitKey(); | |
269 | ||
270 | fcontoursym(htimg, htcontourssym, N); | |
271 | cv::imshow("Блатной поиск контуров", htcontourssym); | |
272 | cv::waitKey(); | |
273 | ||
274 | morph(htimg, htmorphed); | |
275 | cv::imshow("Масштабный морфологический градиент", htmorphed); | |
276 | cv::waitKey(); | |
277 | ||
278 | bin_er(binimg, bineroded); | |
279 | cv::imshow("Бинарная эрозия", bineroded); | |
280 | cv::waitKey(); | |
281 | ||
282 | bin_dil(binimg, bindilated); | |
283 | cv::imshow("Бинарная дилатация", bindilated); | |
284 | cv::waitKey(); | |
285 | ||
286 | bin_dil(bineroded, binopened); | |
287 | cv::imshow("Бинарное открытие", binopened); | |
288 | cv::waitKey(); | |
289 | ||
290 | bin_er(bindilated, binclosed); | |
291 | cv::imshow("Бинарное закрытие", binclosed); | |
292 | cv::waitKey(); | |
293 | cv::destroyAllWindows(); | |
294 | ||
295 | ht_er(htimg, hteroded); | |
296 | cv::imshow("Полутоновая эрозия", hteroded); | |
297 | cv::waitKey(); | |
298 | ||
299 | ht_dil(htimg, htdilated); | |
300 | cv::imshow("Полутоновая дилатация", htdilated); | |
301 | cv::waitKey(); | |
302 | ||
303 | ht_dil(hteroded, htopened); | |
304 | cv::imshow("Полутоновое открытие", htopened); | |
305 | cv::waitKey(); | |
306 | ||
307 | ht_er(htdilated, htclosed); | |
308 | cv::imshow("Полутоновое закрытие", htclosed); | |
309 | cv::waitKey(); | |
310 | ||
311 | return 0; | |
312 | } |