1 2 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); }
|