Emgu обрезать изображение, обрезать неправильную область - PullRequest
1 голос
/ 29 мая 2019

Я практикуюсь с библиотеками emgu, пытаюсь обрезать изображение, чтобы позже применить другой фильтр или поиск, проблема в том, что я выбираю прямоугольник с помощью мыши, в ImageBox (компонент Emgu) я ​​выбрал увеличение в свойстве SizeMode,и загрузите изображение обрезки в другое окно изображения, но результат всегда немного превышает выбранную область.

Я проверяю расчет с помощью GIMP и вижу, что с прямоугольником все в порядке, поэтому я не знаю, что можнобудет проблема

Point f1=scaleCalculation(firstPoint, pIma.Size, imOri.Size);
Point f2= scaleCalculation(secondPoint, pIma.Size, imOri.Size);
imGray.ROI = new Rectangle(Math.Min(f1.X, f2.X), Math.Min(f1.Y, f2.Y)
                        , Math.Abs(f1.X - f2.X), Math.Abs(f1.Y-f2.Y));
imOri.ROI = imGray.ROI;
pRec.Image = imOri.Copy();
imOri.ROI = new Rectangle();

А вот и функция

        private Point scaleCalculation(Point real, Size pBox, Size imCalc) {

        double scale, spare;

        try {
            if (imCalc.Height > imCalc.Width){
                scale = (double) imCalc.Height/ pBox.Height  ;
                spare =  pBox.Width-((imCalc.Width / scale));
                var x = ((real.X * scale) -(spare/4));
                x = (x < 0) ? 0 : x;
                return new Point((int) x, (int)(real.Y * scale));
            }
            else {
                scale = (double) imCalc.Width/ pBox.Width ;
                spare = pBox.Height - ((imCalc.Height / scale));
                var y = ((real.Y * scale) - (spare /4));
                y = (y < 0) ? 0 : y;
                return new Point((int)(real.X * scale), (int) y);
            }
        }
        catch (Exception ex) {
            return new Point();
        }
    }

enter image description here

1 Ответ

0 голосов
/ 01 июня 2019

Через некоторое время я вижу, что проблема была в функции вычисления масштаба.

        private Point scaleCalculation(Point real, Size pBox, Size imCalc) {

        double scale, spare;

        try {
            if (imCalc.Height > imCalc.Width){
                scale = (double)imCalc.Height / pBox.Height;
                spare = (pBox.Width - (imCalc.Width / scale)) / 2;  
                var x = (real.X - spare);
                x = (x < 0) ? 0 : x;
                return new Point((int)(x * scale), (int)(real.Y * scale));
            }
            else {
                scale = (double)imCalc.Width / pBox.Width;
                spare = (pBox.Height - (imCalc.Height/scale))/2;
                var y = (real.Y - spare);
                y = (y < 0) ? 0 : y;
                return new Point((int)(real.X * scale),(int) (y *scale));
            }
        }
        catch (Exception ex) {
            return new Point();
        }
    }

Я попытаюсь объяснить это здесь с помощью рисунка.

(Xr, Yr): координата, которую мы хотим знать.(Xm, Ym): координата мыши.(Wi, Hi): размер картинки.(Wp, Hp): размер поля изображения.S: пространство от края поля Imagebox до изображения.

Xr = (Xm * scale)
S = [Hp -(Hi/scale)]/2
Yr = (Ym-S)

(это объяснение, когда ширина больше высоты)

Первое, что я делаю, это вычисляю масштаб, используя ширину илизависит от высоты, которая больше.

Чтобы вычислить S (запасную), высота изображения должна масштабироваться до высоты Imagebox, вычесть его из высоты Imagebox и разделить на 2, чтобы результат имел значениетолько одного размера.

Из Ym (Real.Y) вычитается запасная часть для вычисления y.и проверьте, является ли результат отрицательным.

Наконец, результат - Xm и y, умноженные для масштаба соответственно

enter image description here

...