| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 
 | #include <iostream>
 #include <opencv2/core/core.hpp>
 #include <opencv2/highgui/highgui.hpp>
 void center_axis(InputArray _src, Mat&  dst)
 {
 typedef struct MyStruct
 {
 Point position;
 float num;
 }MyStruct;
 uchar lut[] = { 200, 206, 220, 204, 0, 207, 0, 204, 0, 207, 221, 51, 1, 207, 221, 51,
 0, 0, 221, 204, 0, 0, 0, 204, 1, 207, 221, 51, 1, 207, 221, 51 };
 Mat src = _src.getMat();
 distanceTransform(src, src, DIST_L2, DIST_MASK_3, 5);
 normalize(src, src, 0, 255, NORM_MINMAX);
 Mat img_row = src.reshape(0, 1);
 vector<MyStruct> my_vector;
 for (size_t j = 0; j < img_row.cols; j++)
 {
 if (img_row.at<float>(0, j) == 0) continue;
 MyStruct my_struct;
 my_struct.num = saturate_cast<float>(img_row.at<float>(0, j));
 my_struct.position = Point(saturate_cast<int>(j % src.cols), saturate_cast<int>(j / src.cols));
 my_vector.push_back(my_struct);
 }
 for (size_t i = 0; i < my_vector.size(); i++)
 {
 if (my_vector[i].num == 0) continue;
 for (size_t j = i; j < my_vector.size(); j++)
 {
 MyStruct temp;
 if (my_vector[i].num >= my_vector[j].num)
 {
 if (my_vector[j].num == 0) continue;
 temp = my_vector[j];
 my_vector[j] = my_vector[i];
 my_vector[i] = temp;
 }
 }
 }
 for (size_t i = 0; i < my_vector.size(); i++)
 {
 if (my_vector[i].position.y == 1
 || my_vector[i].position.x == 1
 || my_vector[i].position.y == src.rows - 1
 || my_vector[i].position.x == src.cols - 1
 || src.at<float>(my_vector[i].position.y, my_vector[i].position.x) == 0) continue;
 else
 {
 char num[] = { 1,1,1,1,1,1,1,1 };
 num[0] = src.at<float>(my_vector[i].position.y - 1, my_vector[i].position.x - 1)
 > 0 ? 1 : 0;
 num[1] = src.at<float>(my_vector[i].position.y - 1, my_vector[i].position.x)
 > 0 ? 1 : 0;
 num[2] = src.at<float>(my_vector[i].position.y - 1, my_vector[i].position.x + 1)
 > 0 ? 1 : 0;
 num[3] = src.at<float>(my_vector[i].position.y, my_vector[i].position.x - 1)
 > 0 ? 1 : 0;
 num[4] = src.at<float>(my_vector[i].position.y, my_vector[i].position.x + 1)
 > 0 ? 1 : 0;
 num[5] = src.at<float>(my_vector[i].position.y + 1, my_vector[i].position.x - 1)
 > 0 ? 1 : 0;
 num[6] = src.at<float>(my_vector[i].position.y + 1, my_vector[i].position.x)
 > 0 ? 1 : 0;
 num[7] = src.at<float>(my_vector[i].position.y + 1, my_vector[i].position.x + 1)
 > 0 ? 1 : 0;
 int sum = num[0] + num[1] * 2 + num[2] * 4 + num[3] * 8
 + num[4] * 16 + num[5] * 32 + num[6] * 64 + num[7] * 128;
 src.at<float>(my_vector[i].position.y, my_vector[i].position.x) = ((lut[uchar(sum / 8)] >> sum % 8) & 1) != 1 ? 255 : 0;
 }
 }
 dst = src.clone();
 dst.convertTo(dst, CV_8UC1);
 }
 
 int main(){
 cv::Mat src = cv::imread("XXX.png");
 cv::Mat gray,center_axis_img;
 cv::cvtColor(src,gray,cv::COLOR_BGR2GRAY);
 center_axis_img = center_axis(InputArray _src, Mat&  dst);
 cv::imwrite("center_axis_img.png",center_axis_img);
 }
 
 
 
 |