代码之家  ›  专栏  ›  技术社区  ›  Sina

在Emgu或opencv中组合多个图像

  •  1
  • Sina  · 技术社区  · 8 年前

    我有很多颜色范围需要过滤,然后结合实现的图像,得到一个单一的图像包含所有这些过滤的颜色。这样地:

        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>();            
                    }
    

    “颜色”是以字符串形式保存的RGB颜色数组。 我正在寻找最快的方式来合并(合并)所有的灰度图像2。 非常感谢。

    2 回复  |  直到 8 年前
        1
  •  0
  •   Trzywu    8 年前

    我不知道你到底想要什么。我用python的opencv编写了一个简单的程序。因为你有灰度图像,你可以添加这些图像,但你需要记住这一点。如果在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)
    
        2
  •  0
  •   Hasan    7 年前

    我是这样做的,先把图像转换成位图,然后再把它们组合起来,速度非常快:

        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;
    
            }