Я пытаюсь использовать C # -EmguCV, чтобы найти дефицит на бутылке ... Пока что я сделал следующие шаги: 1-Преобразование изображения BGR-в-СЕРЫЙ 2-бинаризация (делая фон черным) 3-Erode 4-Masking5-Crop
-My Входное изображение: введите описание изображения здесь - После бинаризации, эрозии и маскировки : введите описание изображения здесь
- После кадрирования : введите описание изображения здесь
-> Как определить дефицит, как показано ниже-Lab результат изображения: введите описание изображения здесь
im, используя следующий код:
ImgInput = new Image<Bgr, byte>(ofd.FileName);// 3 dimension
ImgGray = ImgInput.Convert<Gray, byte>();//Convert BGR-GRAY
pictureBox1.Image = ImgGray.Bitmap;
//Binarization thresholding
ImgBinariz = new Image<Gray, byte>(ImgGray.Width, ImgGray.Height, new Gray(0));//binay imge with black background
// pictureBox1.Image = ImgBinariz.Bitmap; //Make all the image black
CvInvoke.Threshold(ImgGray, ImgBinariz, 50, 255, ThresholdType.Otsu);
//Masking(And)
Img1AndImg2 = ImgInput.Convert<Gray, byte>();//Convert BGR-GRAY
CvInvoke.BitwiseAnd(ImgGray, ImgBinariz.Dilate(1).Erode(5), Img1AndImg2);// the background is black
pictureBox1.Image = Img1AndImg2.Bitmap;
//Cropping Objects from Segmented Images
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
Mat m = new Mat();
CvInvoke.FindContours(Img1AndImg2, contours, m, Emgu.CV.CvEnum.RetrType.External,//the image i need Croppe from it
Emgu.CV.CvEnum.ChainApproxMethod.ChainApproxSimple);
if (contours.Size > 0)
{
Rectangle bbox = CvInvoke.BoundingRectangle(contours[0]);
Img1AndImg2.ROI = bbox;
var img = Img1AndImg2.Copy();
Img1AndImg2.ROI = Rectangle.Empty;
pictureBox1.Image = img.Erode(3).Bitmap; //CC = imerode(Iobj, ones(erode)); image erode --->make the diffect as squer
}