Объедините несколько изображений в Emgu или OpenCV

У меня есть множество диапазонов цветов, которые необходимо отфильтровать, а затем объединить полученные изображения, чтобы получить одно изображение, содержащее все эти отфильтрованные цвета. как это:

    Image<Gray, Byte> grayscale2 = frame2.Convert<Gray, Byte>();
                for (int i = 1; i < colors.Length - 1; i++)
                {
                    var color1 = colors[i].Split('-');
                    var color2 = colors[i+1].Split('-');
                   var img = frame2.InRange(new Bgr(double.Parse(color1[0]), 
                                 double.Parse(color1[1]), double.Parse(color1[2])),
                        new Bgr(double.Parse(color2[0]), double.Parse(color2[1]), 
                                 double.Parse(color2[2]))).Convert<Gray, Byte>();            
                }

"colors" - это массив RGB сохраненных цветов в виде строки. Я ищу самый быстрый способ объединить (объединить) все img в оттенках серого2. Спасибо.

1 ответ

Я не знаю точно, что ты хочешь. Я сделал простую программу в opencv на python. Поскольку у вас есть изображение в градациях серого, вы можете добавить эти изображения, но вы должны помнить это. Если в пикселе image1 имеет значение 150, а в image2 значение 150, конечный пиксель имеет значение 255. Таким образом, вы должны добавить их с весом.

import cv2 as cv
import numpy as np


img1= cv.imread('image1.jpg')
img2= cv.imread('image2.jpg')


hsv1 = cv.cvtColor(img1, cv.COLOR_BGR2HSV)
hsv2 = cv.cvtColor(img2, cv.COLOR_BGR2HSV)

lower_blue = np.array([110, 50, 50])
upper_blue = np.array([130, 255, 255])

mask1 = cv.inRange(hsv1, lower_blue, upper_blue)
mask2 = cv.inRange(hsv2, lower_blue, upper_blue)

alpha=0.5
beta =0.5
output =cv.addWeighted( mask1, alpha, mask2, beta, 0.0, )

cv.imshow('av1',img1)
cv.imshow('av2',img2)
cv.imshow('av3',mask1)
cv.imshow('av4',mask2)
cv.imshow('av4',output)

cv.waitKey(0)

Я сделал что-то вроде этого, сначала преобразовав изображения в растровое изображение, а затем объединил их:

    public static Bitmap CombineBitmap(string[] files)
    {
        //change the location to store the final image.

        Bitmap img = new Bitmap(files[0]);

        Bitmap img3 = new Bitmap(img.Width, img.Height);
        Graphics g = Graphics.FromImage(img3);
        g.Clear(SystemColors.AppWorkspace);
        foreach (string file in files)
        {
             img = new Bitmap(file);

            img.MakeTransparent(Color.White);
            g.DrawImage(img, new Point(0, 0));
            //img3.MakeTransparent(Color.White);

        }


        using (var b = new Bitmap(img3.Width, img3.Height))
        {
            b.SetResolution(img3.HorizontalResolution, img3.VerticalResolution);

            using (var g2 = Graphics.FromImage(b))
            {
                g2.Clear(Color.White);
                g2.DrawImageUnscaled(img3, 0, 0);
            }

            // Now save b as a JPEG like you normally would
            return img3;

        }
Другие вопросы по тегам