View difference between Paste ID: 1EweVcX4 and YjkpGv8s
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
}