#include<iostream>
#include<opencv2/opencv.hpp>
int max(int& a, int& b, int& c)
{
int max = a;
if (b > max)
{
max = b;
}
if (c > max)
{
max = c;
}
return max;
}
int min(int& a, int& b, int& c)
{
int min = a;
if (b < min)
{
min = b;
}
if (c < min)
{
min = c;
}
return min;
}
void Rgb2Hsv(float R, float G, float B, float& H, float& S, float& V)
{
float min, max, delta, tmp;
tmp = R > G ? G : R;
min = tmp > B ? B : tmp;
tmp = R > G ? R : G;
max = tmp > B ? tmp : B;
V = max;
delta = max - min;
if (max != 0)
S = delta / max;
else
{
S = 0;
H = 0;
return;
}
if (delta == 0) {
H = 0;
return;
}
else if (R == max) {
if (G >= B)
H = (G - B) / delta;
else
H = (G - B) / delta + 6.0;
}
else if (G == max)
H = 2.0 + (B - R) / delta;
else if (B == max)
H = 4.0 + (R - G) / delta;
H *= 60.0;
}
using namespace std;
using namespace cv;
int main()
{
Mat scrImg1280 = imread("E:\\哈工智能\\fenge\\watershedone\\watershedone\\dst_ct.jpg");
float mymax = 0.0;
double minv = 0.0, maxv = 0.0;
double* minp = &minv;
double* maxp = &maxv;
minMaxIdx(scrImg1280, minp, maxp);
cout << *minp << endl << *maxp << endl;
Rect cropRect1280(455, 70, 360, 395);
cropImg = scrImg1280(cropRect1280);
float H, S, V;
Mat redImg(cropImg.rows, cropImg.cols, CV_8UC3, Scalar::all(0));
for (int i = 0; i < cropImg.rows; i++)
{
for (int j = 0; j < cropImg.cols; j++)
{
Rgb2Hsv(cropImg.ptr<Vec3b>(i)[j][2], cropImg.ptr<Vec3b>(i)[j][1], cropImg.ptr<Vec3b>(i)[j][0], H, S, V);
if ((((312 < H) && (H < 360)) || ((0 < H) && (H < 50))) && (S > 0.5))
{
redImg.ptr<Vec3b>(i)[j][0] = cropImg.ptr<Vec3b>(i)[j][0];
redImg.ptr<Vec3b>(i)[j][1] = cropImg.ptr<Vec3b>(i)[j][1];
redImg.ptr<Vec3b>(i)[j][2] = cropImg.ptr<Vec3b>(i)[j][2];
}
else
{
redImg.ptr<Vec3b>(i)[j][0] = 0;
redImg.ptr<Vec3b>(i)[j][1] = 0;
redImg.ptr<Vec3b>(i)[j][2] = 0;
}
}
}
Mat grayImage;
cvtColor(redImg, grayImage, COLOR_BGR2GRAY);
Mat threshold_img;
threshold(grayImage, threshold_img, 0, 255, THRESH_OTSU);
Mat element = getStructuringElement(MORPH_RECT, Size(3, 3));
morphologyEx(threshold_img, threshold_img, MORPH_CLOSE, element, Point(-1, -1));
imshow("morph", threshold_img);
Mat dist;
distanceTransform(threshold_img, dist, DIST_L2, 5);
normalize(dist, dist, 0, 255, cv::NORM_MINMAX);
double my_minv = 0.0, my_maxv = 0.0;
minMaxIdx(dist, &my_minv, &my_maxv);
Mat sure_fg;
threshold(dist, sure_fg, 0.8 * my_maxv, 255, THRESH_BINARY);
dilate(sure_fg, sure_fg, element, Point(-1, -1), 17);
sure_fg.convertTo(sure_fg, CV_8U);
imshow("sure_fg", sure_fg);
Mat element1 = getStructuringElement(MORPH_ELLIPSE, Size(3, 3));
Mat sure_bg;
dilate(threshold_img, sure_bg, element, Point(-1, -1));
imshow("sure_bg", sure_bg);
Mat unkonwn = Mat(threshold_img.size(), CV_8U);
unkonwn = sure_bg-sure_fg;
imshow("unkonwn",unkonwn);
Mat label_img = Mat(threshold_img.size(), CV_32S);
int num = connectedComponents(sure_fg, label_img, 8);
label_img = label_img +1;
for (int i = 0; i < unkonwn.rows; i++)
{
for (int j = 0; j < unkonwn.cols; j++)
{
if (((int)unkonwn.at<uchar>(i, j)) == 255)
{
label_img.at<signed int>(i, j) = 0;
}
}
}
watershed(redImg, label_img);
Mat v1 = Mat(redImg.size(), CV_8UC3);
for (int i = 0; i < sure_bg.rows; i++)
{
for (int j = 0; j < sure_bg.cols; j++)
{
if (label_img.at<signed int>(i, j)==-1)
{
redImg.at<Vec3b>(i, j)[0] = 0;
redImg.at<Vec3b>(i, j)[1] = 255;
redImg.at<Vec3b>(i, j)[2] = 255;
}
}
}
imshow("src", redImg);
waitKey(0);
return 0;
}