凤凰平台注册开户_凤凰彩票app下载安装_凤凰彩票投注网

热门关键词: 凤凰平台注册开户,凤凰彩票app下载安装,凤凰彩票投注网

Opencv利用ROI将一张图片叠加到另一幅图像的指定

作者: 编程知识  发布:2019-09-24

==========================分割线============================
显示结果
凤凰彩票app下载安装 1
=========================分割线======================

三、线性混合

线性混合正是,对两幅图像(f0(x)和f1(x))或两段摄像(同样为(f0(x)和f1(x))产生时间上的镜头叠化(cross-dissolve)效果,如同幻灯片放映和影片制作中的那样。函数表示为:

凤凰彩票app下载安装 2

贯彻漫水填充算法:floodFill函数

foodFill函数有几个版本,贰个不带掩码的mask的版本,一个是带有mask的本子

先是个本子

floodFill( InputOutputArray image,

               Point seedPoint, 

               Scalar newVal, 

               CV_OUT Rect* rect = 0,

凤凰彩票app下载安装,               Scalar loDiff = Scalar(), 

               Scalar upDiff = Scalar(),

               int flags = 4 

               );

其次个本子

floodFill( InputOutputArray image, 

              InputOutputArray mask,

              Point seedPoint,

               Scalar newVal,

               CV_OUT Rect* rect=0,

                Scalar loDiff = Scalar(),

                Scalar upDiff = Scalar(),

                int flags = 4 

            );

首先个参数,InputOutputArray类型的image, 输入/输出1通道或3通道,8位或浮点图像,具体参数由之后的参数具体指明。

其次个参数, InputOutputArray类型的mask,那是第二个版本的floodFill独享的参数,表示操作掩模,。它应有为单通道、8位、长和宽上都比输入图像 image 大多少个像素点的图像。第贰个本子的floodFill须要接纳以及更新掩膜,所以那几个mask参数我们须要求将其企图好并填在那边。须求小心的是,漫水填充不会填充掩膜mask的非零像素区域。举个例子,一个边缘检查测验算子的输出能够用来作为掩膜,以堤防填充到边缘。一样的,也足以在多次的函数调用中利用同多个掩膜,以保险填充的区域不会重叠。其它须要注意的是,掩膜mask会比需填充的图像大,所以 mask 中与输入图像(x,y)像素点相对应的点的坐标为(x+1,y+1)。

其八个参数,Point类型的seedPoint,漫水填充算法的初始点。

第几个参数,Scalar类型的newVal,像素点被染色的值,即在重绘区域像素的新值。

第四个参数,Rect*花色的rect,有私下认可值0,二个可选的参数,用于安装floodFill函数将要重绘区域的细微边界矩形区域。

第五个参数,Scalar类型的loDiff,有暗中同意值Scalar( ),表示近日观望像素值与其构件邻域像素值恐怕待加入该构件的种子像素之间的亮度或颜色之负差(lower brightness/color difference)的最大值。

第多个参数,Scalar类型的upDiff,有暗许值Scalar( ),表示这段时间观测像素值与其构件邻域像素值或然待参与该构件的种子像素之间的亮度或颜色之正差(lower brightness/color difference)的最大值。

第多少个参数,int类型的flags,操作标记符,此参数满含多少个部分,比较复杂,大家一起详细看看。

低八位(第0~7位)用于控制算法的连通性,可取4 (4为缺省值) 可能8。如若设为4,表示填充算法只怀念当下像素水平方向和垂直方向的相邻点;假若设为 8,除上述相邻点外,还可能会蕴藏对角线方向的相邻点。

高八位部分(16~贰14个人)可认为0 或许正如两种选取标记符的重组:

FLOODFILL_FIXED_RANGE- 假若设置为那些标志符的话,就可以虚构当下像素与种子像素之间的差,否则就思量当下像素与其相邻像素的差。相当于说,那一个界定是转变的。

FLOODFILL_MASK_ONLY- 若是设置为那个标记符的话,函数不会去填充退换原有图像 (相当于忽视第多少个参数newVal), 而是去填充掩模图像(mask)。这些标志符只对第一个本子的floodFill有用,因第一个版本里面压根就从不mask参数。

中档几个人局地,上面境海关于高八人FLOODFILL_MASK_ONLY标记符中已经说的很引人瞩目,须要输入符合需要的掩码。Floodfill的flags参数的中档陆个人的值正是用来钦命填充掩码图像的值的。但只要flags中间多少人的值为0,则掩码会用1来填充。

而具有flags能够用or操作符连接起来,即“|”。举例,假若想用8邻域填充,并填写固定像素值范围,填充掩码实际不是填充源图像,以及设填充钱为38,那么输入的参数是那般:

flags=8 | FLOODFILL_MASK_ONLY | FLOODFILL_FIXED_RANGE | (38<<8)

代码达成:

NSString *image = @"words.jpg";

UIImage *image1 = [UIImage imageNamed:image];

Mat im;

UIImageToMat(image1, im);

if (im.empty()) {

return;

}

cvtColor(im, dst, CV_BGRA2BG大切诺基,3);// 将得到的图样调换为我们能够运用的图片,使用floodFill必得是1通路也许是三通道的图纸,那些函数的使用方式参照openCV中颜色空间改造cvtColor()

cv::Rect ccomp;

cv::floodFill(dst, cv::Point(100,100), Scalar(50,0,150),&ccomp,Scalar(20,20,20),Scalar(20,20,20));

self.secondImageView.image = MatToUIImage(dst);

兑现效果与利益

凤凰彩票app下载安装 3

参照他事他说加以考察资料:

学学代码

 1 /* 2     利用ROI将一幅图像叠加到另一幅图像的指定位置 3 */ 4   5 #include <opencv2/core/core.hpp>     6 #include <opencv2/highgui/highgui.hpp>     7 #include <opencv2/imgproc/imgproc.hpp>    8 #include <iostream>   9 using namespace std;10 using namespace cv;11  12 int main()13 {14     //读入两幅图像并检查图像是否读取成功  15     Mat srcImage = imread("D:\OutPutResult\ImageTest\dog1.jpg");16     Mat signal = imread("D:\OutPutResult\ImageTest\signal.jpg");17     if (!srcImage.data || !signal.data)18     {19         cout << "读取图像有误,请重新输入正确路径!n";20         return false;21     }22     imshow("", srcImage);23     imshow("", signal);24  25     //定义一个Mat类型并给其设定ROI区域26     Mat imageROI = srcImage(Rect(450, 20, signal.cols, signal.rows));    //450,20为自定义起始点坐标27     //加载掩模28     Mat mask = imread("D:\OutPutResult\ImageTest\signal.jpg", 0);    //参数0显示为灰度图29     //将掩模复制到ROI30     signal.copyTo(imageROI, mask);31     //显示结果32     namedWindow("利用ROI实现图像叠加");33     imshow("利用ROI实现图像叠加", srcImage);34     waitKey(0);35     return 0;36 }

五、图像混合综合代码及深入分析

//-----------------------------------【程序说明】----------------------------------------------
//  程序名称::【OpenCV入门教程之四】分离颜色通道&多通道图像混合   配套源码 
// VS2010版   OpenCV版本:2.4.8
//     2014年3月13 日 Create by 浅墨
//  图片素材出处:dota2原画 dota2logo  
//     配套博文链接:http://blog.csdn.net/poem_qianmo/article/details/20537737
//     浅墨的微博:@浅墨_毛星云
//------------------------------------------------------------------------------------------------

//-----------------------------------【头文件包含部分】---------------------------------------
//    描述:包含程序所依赖的头文件
//----------------------------------------------------------------------------------------------   

#include <cv.hpp>
#include <highgui.hpp>
#include <iostream>

//-----------------------------------【命名空间声明部分】---------------------------------------
//    描述:包含程序所使用的命名空间
//-----------------------------------------------------------------------------------------------   
using namespace cv;
using namespace std;


//-----------------------------------【全局函数声明部分】--------------------------------------
//    描述:全局函数声明
//-----------------------------------------------------------------------------------------------
bool  MultiChannelBlending();

//-----------------------------------【main( )函数】--------------------------------------------
//    描述:控制台应用程序的入口函数,我们的程序从这里开始
//-----------------------------------------------------------------------------------------------
int main(   )
{
    system("color 5E");

    if(MultiChannelBlending( ))
    {
        cout<<endl<<"嗯。好了,得出了你需要的混合值图像~";
    }

    waitKey(0);
    return 0;
}


//-----------------------------【MultiChannelBlending( )函数】--------------------------------
//    描述:多通道混合的实现函数
//-----------------------------------------------------------------------------------------------
bool  MultiChannelBlending()
{
    //【0】定义相关变量
    Mat srcImage,greSrcImage,redSrcImage;    
    Mat logoImage;
    vector<Mat> channels;
    Mat  imageBlueChannel;
    //【0】定义相关变量
    Mat  imageGreenChannel;
    //【0】定义相关变量
    Mat  imageRedChannel,redTempImage,greTempImage,blueTempImage;

    //=================【蓝色通道部分】=================
    //    描述:多通道混合-蓝色分量部分
    //============================================

    // 【1】读入图片
    logoImage= imread("dota_logo.jpg",0);
    srcImage= imread("dota_jugg.jpg");

    if( !logoImage.data ) { printf("Oh,no,读取logoImage错误~! n"); return false; }
    if( !srcImage.data ) { printf("Oh,no,读取srcImage错误~! n"); return false; }
    srcImage.copyTo(greSrcImage);
    srcImage.copyTo(redSrcImage);
    //【2】把一个3通道图像转换成3个单通道图像
    split(srcImage,channels);//分离色彩通道

    //【3】将原图的蓝色通道引用返回给imageBlueChannel,注意是引用,相当于两者等价,修改其中一个另一个跟着变
    imageBlueChannel= channels.at(0);
    //这是引用,指向channels,后面调用clear,这样数据清空了
    //imageGreenChannel = channels.at(1);    



    ////展示单通道图像
    //imshow("单通道蓝色图像",imageBlueChannel);
    //imshow("单通道红色图像",imageRedChannel);
    //imshow("单通道绿色图像",imageGreenChannel);    

    //【4】将原图的蓝色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageBlueChannel中
    addWeighted(imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,
        logoImage,0.5,0,imageBlueChannel(Rect(500,250,logoImage.cols,logoImage.rows)));
    imshow("加载log后的蓝色图像",imageBlueChannel);

    //【5】将三个单通道重新合并成一个三通道
    merge(channels,srcImage);

    //【6】显示效果图

    imshow(" 游戏原画+logo蓝色通道",srcImage);


    //=================【绿色通道部分】=================
    //    描述:多通道混合-绿色分量部分
    //============================================
//    imshow("绿色图像原图像",greSrcImage);
    //因为同道中蓝色通道已经加载logo进去,所以此时logo会有变化的,重新分离通道
    channels.clear();
    split(greSrcImage,channels);
    imageGreenChannel = channels.at(1);    
    //【4】将原图的绿色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageGreenChannel中
    addWeighted(imageGreenChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,
        logoImage,0.5,0.,imageGreenChannel(Rect(500,250,logoImage.cols,logoImage.rows)));

    //【5】将三个独立的单通道重新合并成一个三通道,如果继续这样,因为同道中蓝色通道已经加载logo进去,所以此时logo会有变化的
    merge(channels,greSrcImage);



    //【6】显示效果图    
    imshow("<2>游戏原画+logo绿色通道",greSrcImage);



    //=================【红色通道部分】=================
    //    描述:多通道混合-红色分量部分
    //============================================
    channels.clear();
        split(redSrcImage,channels);
        imageRedChannel = channels.at(2);    
    //【4】将原图的红色通道的(500,250)坐标处右下方的一块区域和logo图进行加权操作,将得到的混合结果存到imageRedChannel中
    addWeighted(imageRedChannel(Rect(500,250,logoImage.cols,logoImage.rows)),1.0,
        logoImage,0.5,0.,imageRedChannel(Rect(500,250,logoImage.cols,logoImage.rows)));

    //【5】将三个独立的单通道重新合并成一个三通道
    merge(channels,redSrcImage);

    //【6】显示效果图    
    imshow("<3>游戏原画+logo红色通道",redSrcImage);

    return true;
}

凤凰彩票app下载安装 4凤凰彩票app下载安装 5凤凰彩票app下载安装 6凤凰彩票app下载安装 7凤凰彩票app下载安装 8凤凰彩票app下载安装 9

凤凰彩票app下载安装 10

漫水填充的概念

漫水填充是一种用特定的颜色填充连通区域,通过安装可连通像素的上下限以及连接情势实现分化的填充效果的格局。漫水填充平日用来标识恐怕是分别图像的一有的,以便对其进展进一步处理货深入分析,也能够用来从输入图像获取掩码区域,掩码会加快管理进程,可能只管理钦定的像素点,操作的结果一连某些一而再的区域。

机器配置为:VS2013+opencv2.4.13+Win-64bit。
===========================分割线========================
本节将选择ROI将一幅图像叠合到另一幅图像的钦命地方。
现实进程见上边代码
=======================分割线========================
代码演示

在图像管理中,目的区域定义为感兴趣区域ROI(region of Interest),那是后期图像处理的基础,在获得ROI后,进行部分列的管理。ROI区域在Opencv中正是Rect,先塑造Rect,然后给予ROI一些风味,产生了图像掩膜。

程序表达
大家拜见到程序里有如此一行代码
1 signal.copyTo(imageROI, mask);
括号里,第多个参数表示为出口图像,第二参数表示为掩码。
大家也得以将这部分内容如此改,见下图:
凤凰彩票app下载安装 11
改后的就不带mask参数,其结果展现都以毫发不爽的,那么如何晓得带mask参数的这种艺术呢?
答:对于形如函数srcImage.copyto(dstImage, mask),mask作为三个掩模板。
函数会检查评定mask中要是在有些像素点其值为1(只看率先坦途,所以mask单通道就能够)则把srcImage.at处的值直接赋给dstImage.at;如若其值为0则dstImage.at处保留其原来像素值。
===============================END============================

四、多通道颜色混合

彩色图疑似三通道图像,当然灰度图像是单通道图像,在图像应用中要求对某一大路混合,或许多少个通道颜色混合,那就是多通道颜色混合。在多通道颜色混合应用中在opencv需求split函数和merge函数。

讲究作品小说,此文来源地址:

二、图像掩膜

图像掩膜,在ROI区域中程导弹入一张图像,然后在image中举行加载

Mat Image1= imread("dota_pa.jpg"); 
//定义一个Mat类型并给其设定ROI区域  ,指向Image中坐标点200,250,长宽为cols和rows
       Mat imageROI= Image1(Rect(200,250,logoImage.cols,logoImage.rows));  

       //加载掩模(必须是灰度图)  
       Mat mask= imread("dota_logo.jpg",0);  

       //将掩膜拷贝到ROI  
       logoImage.copyTo(imageROI,mask);

六、结果深入分析

1、上述代码中有ROI,便是创制感兴趣区域,在代码中央直属机关接用addweight函数直接到位了,达成mask的创导,是在SrcImage中ROI通过加权,将想要的图像加载个中,完成mask的开创。

2、代码中对split和merge举办身体力行、批注,split函数用于获取单通道图像,程序中对单通道图像进行体现,开掘单通道图像都是灰度图像,只是各类单通道图像亮度差别,表明了在彩色图像中red各占的比例大小。同期对于开展mask管理后的图像举办展示,当然也是灰度图像。

3、程序中分别是在srcImage中拿走到红影青的logo进行拍卖,便是先将索要的大道获取到,将logo根据一定比重增加个中(通道图像权主要高级中学一年级些,工夫让在roi中夜色侵夺主动),然后再统一。

4、程序一定注意到mat类型的行使,在前后相继大多数操作时引用,要记得保存未修改的数码。

1、分离颜色通道

C++: void split(const Mat& src, Mat*mvbegin);

C++: void split(InputArray m,OutputArrayOfArrays mv);
//第一个参数,InputArray类型的m或者const Mat&类型的src,填我们需要进行分离的多通道数组。
//第二个参数,OutputArrayOfArrays类型的mv,填函数的输出数组或者输出的vector容器

split函数分割多通道数组转变来独立的单通道数组,按公式来说:凤凰彩票app下载安装 12

class CV_EXPORTS _OutputArray : public_InputArray
{
public:
   _OutputArray();

   _OutputArray(Mat& m);
   template<typename _Tp> _OutputArray(vector<_Tp>& vec);
   template<typename _Tp> _OutputArray(vector<vector<_Tp>>& vec);
   _OutputArray(vector<Mat>& vec);
   template<typename _Tp> _OutputArray(vector<Mat_<_Tp>>& vec);
   template<typename _Tp> _OutputArray(Mat_<_Tp>& m);
   template<typename _Tp, int m, int n> _OutputArray(Matx<_Tp, m,n>& matx);
   template<typename _Tp> _OutputArray(_Tp* vec, int n);
   _OutputArray(gpu::GpuMat& d_mat);
   _OutputArray(ogl::Buffer& buf);
   _OutputArray(ogl::Texture2D& tex);

    _OutputArray(constMat& m);
   template<typename _Tp> _OutputArray(const vector<_Tp>&vec);
   template<typename _Tp> _OutputArray(constvector<vector<_Tp> >& vec);
   _OutputArray(const vector<Mat>& vec);
   template<typename _Tp> _OutputArray(const vector<Mat_<_Tp>>& vec);
   template<typename _Tp> _OutputArray(const Mat_<_Tp>& m);
   template<typename _Tp, int m, int n> _OutputArray(constMatx<_Tp, m, n>& matx);
   template<typename _Tp> _OutputArray(const _Tp* vec, int n);
   _OutputArray(const gpu::GpuMat& d_mat);
   _OutputArray(const ogl::Buffer& buf);
   _OutputArray(const ogl::Texture2D& tex);

   virtual bool fixedSize() const;
   virtual bool fixedType() const;
   virtual bool needed() const;
   virtual Mat& getMatRef(int i=-1) const;
   /*virtual*/ gpu::GpuMat& getGpuMatRef() const;
   /*virtual*/ ogl::Buffer& getOGlBufferRef() const;
   /*virtual*/ ogl::Texture2D& getOGlTexture2DRef() const;
   virtual void create(Size sz, int type, int i=-1, bool allowTransposed=false,int fixedDepthMask=0) const;
   virtual void create(int rows, int cols, int type, int i=-1, boolallowTransposed=false, int fixedDepthMask=0) const;
   virtual void create(int dims, const int* size, int type, int i=-1, boolallowTransposed=false, int fixedDepthMask=0) const;
   virtual void release() const;
   virtual void clear() const;

#ifdefOPENCV_CAN_BREAK_BINARY_COMPATIBILITY
   virtual ~_OutputArray();
#endif
};

地点函数解说是OutputArray类原型,当中是模板类为主,注意类对象的开创。

split函数应用

vector<Mat> channels;
Mat imageBlueChannel;
Mat imageGreenChannel;
Mat imageRedChannel;
srcImage4= imread("dota.jpg");
// 把一个3通道图像转换成3个单通道图像
split(srcImage4,channels);//分离色彩通道
imageBlueChannel = channels.at(0);
imageGreenChannel = channels.at(1);
imageRedChannel = channels.at(2);

载入的3坦途图像转变来3个单通道图像,放到vector<Mat>类型的channels中,接着进行援用赋值。

听别人说OpenCV的BG安德拉色彩空间(bule,Green,Red,葡萄紫红),个中channels.at(0)就象征援用抽出channels中的紫红分量,channels.at(1)就代表援用抽出channels中的珍珠白色分量,channels.at(2)就意味着引用抽取channels中的浅黄分量。

2、实例代码

//【1】读取图像  
       Mat srcImage4= imread("dota_pa.jpg",1);  
       Mat logoImage= imread("dota_logo.jpg");  

       if(!srcImage4.data ) { printf("你妹,读取srcImage4错误~! n"); return false; }  
       if(!logoImage.data ) { printf("你妹,读取logoImage错误~! n"); return false; }  

       //【2】定义一个Mat类型并给其设定ROI区域  
       Mat imageROI;  
              //方法一  
       imageROI=srcImage4(Rect(200,250,logoImage.cols,logoImage.rows));  

       //【3】将logo加到原图上  ,利用线性混合构建掩膜,其中logo权重是0.3,原图中的ROI区域图像是0.5
       addWeighted(imageROI,0.5,logoImage,0.3,0.,imageROI);  

       //【4】显示结果  
       namedWindow("<4>区域线性图像混合示例窗口 by浅墨");  
       imshow("<4>区域线性图像混合示例窗口 by浅墨",srcImage4);  

       return true;

1、opencv函数-addWeighted函数

void addWeighted(InputArray src1, double alpha, InputArray src2, double beta, double gamma, OutputArray dst, int dtype=-1);  
//第一个参数,InputArray类型的src1,表示需要加权的第一个数组,常常填一个Mat。
//第二个参数,alpha,表示第一个数组的权重
//第三个参数,src2,表示第二个数组,它需要和第一个数组拥有相同的尺寸和通道数。
//第四个参数,beta,表示第二个数组的权重值。
//第五个参数,dst,输出的数组,它和输入的两个数组拥有相同的尺寸和通道数。
//第六个参数,gamma,一个加到权重总和上的标量值。看下面的式子自然会理解。
//第七个参数,dtype,输出阵列的可选深度,有默认值-1。;当两个输入数组具有相同的深度时,个参数设置为-1(默认值),即等同于src1.depth()。dst = src1 

addWeighted函数总计如下八个数组(src1和src2)的加权和,获得结果输出给第四个参数。即addWeighted函数的机能能够被代表为为如下的矩阵表明式为: dst = src1[I]*alpha+ src2[I]*beta + gamma;

2、图像混合

图像混合中通过结合一些加以的单通道数组,将那一个孤立的单通道数组合併成三个多通道的数组,进而开创出三个由多个单通道阵列组成的多通道阵列。

merge()函数的效果与利益是split()函数的逆向操作,将多个数组组合合併成三个多通道的数组。

C++: void merge(const Mat* mv, size_tcount, OutputArray dst)
C++: void merge(InputArrayOfArrays mv,OutputArray dst)
//第一个参数,mv,填需要被合并的输入矩阵或vector容器的阵列,这个mv参数中所有的矩阵必须有着一样的尺寸和深度。
//第二个参数,count,当mv为一个空白的C数组时,代表输入矩阵的个数,这个参数显然必须大于1.
//第三个参数,dst,即输出矩阵,和mv[0]拥有一样的尺寸和深度,并且通道的数量是矩阵阵列中的通道的总数。

一、ROI创建

//定义一个Mat类型并给其设定ROI区域

Mat imageROI;

//方法一

imageROI=image(Rect(500,250,logo.cols,logo.rows));
//方法二 
imageROI=Image(Range(250,250+logoImage.rows),Range(200,200+logoImage.cols));

代码中定义了一个Mat类型,是一类别似指针的引用,然后指向Image(Mat)中制订区域,这样就创办了一个ROI区域,这么些区域在Image中。

本文由凤凰平台注册开户发布于编程知识,转载请注明出处:Opencv利用ROI将一张图片叠加到另一幅图像的指定

关键词: