OpenCV合并图像

本文介绍了使用OpenCV库进行图像加载、灰度转换、边缘检测,并将原始图像、灰度图像和边缘检测图像整合到目标图像的过程。通过一系列操作,实现图像的全面分析与展示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

*****************/
#include <cv.h>
#include <highgui.h>
int main()
{
    char* filePath ="D:/图片库/Lena.jpg";
    IplImage* srcImg = cvLoadImage(filePath);
    IplImage* greyImg = cvCreateImage(cvGetSize(srcImg), srcImg->depth, 1);
    IplImage* cannyImg = cvCreateImage(cvGetSize(greyImg), srcImg->depth, 1);
    CvSize dstSize;
    dstSize.width = srcImg->width *3.0;
    dstSize.height = srcImg->height;
    IplImage* dstImg = cvCreateImage(dstSize, srcImg->depth, srcImg->nChannels);
    cvZero(dstImg);
    cvConvertImage(srcImg, greyImg);    
    cvCanny(greyImg, cannyImg, 150, 100);
    //----------------------------------
    //载入原图像到目标图像
    cvSetImageROI(dstImg, cvRect(0, 0, srcImg->width, srcImg->height));
    cvCopy(srcImg, dstImg);
     cvResetImageROI(dstImg);
    //载入灰度图像到目标图像
    cvSetImageROI(dstImg, cvRect(srcImg->width, 0, srcImg->width, srcImg->height));
    dstImg->nChannels =1;
    cvCopy(greyImg, dstImg);
    cvResetImageROI(dstImg);
    //载入边缘检测图像到目标图像
    cvSetImageROI(dstImg, cvRect((srcImg->width) *2.0, 0, srcImg->width, srcImg->height));
    dstImg->nChannels =1;
    cvCopy(cannyImg, dstImg);
    cvResetImageROI(dstImg);
    //---------------------------------------
    cvNamedWindow("dstImg");
    cvShowImage("dstImg", dstImg);
    cvWaitKey(0);
    cvReleaseImage(&srcImg);
    cvReleaseImage(&greyImg);
    cvReleaseImage(&cannyImg);
    cvReleaseImage(&dstImg);
    cvDestroyWindow("dstImg");
    return0;

### 如何使用 OpenCV 合并两张图像 在计算机视觉领域,OpenCV 提供了多种方法来合并两张图像。具体的方法取决于需求,比如简单地将两幅图像拼接在一起还是进行更复杂的操作如加权叠加或融合。 #### 方法一:水平或垂直拼接 可以利用 `numpy` 的 `hstack` 和 `vstack` 函数分别实现水平和垂直方向上的图像拼接[^1]: ```python import cv2 import numpy as np # 加载图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 水平拼接 result_horizontal = np.hstack([img1, img2]) # 垂直拼接 result_vertical = np.vstack((img1, img2)) # 显示结果 cv2.imshow('Horizontal Concatenation', result_horizontal) cv2.imshow('Vertical Concatenation', result_vertical) cv2.waitKey(0) cv2.destroyAllWindows() ``` 上述代码实现了两种基本的拼接方式——水平和垂直方向上连接两张图片。 #### 方法二:使用 OpenCV 自带函数 除了借助 NumPy 外,还可以直接调用 OpenCV 中的 `vconcat` 和 `hconcat` 来完成相同的功能: ```python import cv2 # 加载图像 img1 = cv2.imread('image1.jpg') img2 = cv2.imread('image2.jpg') # 确保尺寸一致(必要时调整) if img1.shape != img2.shape: img2 = cv2.resize(img2, img1.shape[:2][::-1]) # 垂直方向拼接 vertical_concat = cv2.vconcat([img1, img2]) # 水平方向拼接 horizontal_concat = cv2.hconcat([img1, img2]) # 展示结果 cv2.imshow('Vertical Concat using CV2', vertical_concat) cv2.imshow('Horizontal Concat using CV2', horizontal_concat) cv2.waitKey(0) cv2.destroyAllWindows() ``` 此部分代码同样完成了图像间的组合工作,并且强调了当两个输入矩阵形状不同时需先统一其大小。 #### 方法三:加权混合/叠加 对于需要创建一种渐变过渡效果的情况,则可采用加权求和的方式来进行处理[^3]: ```python def blend_images(image_path_1, image_path_2, alpha_value): """ 对两张图片按照指定权重比例进行混合 参数: image_path_1 (str): 第一幅图路径. image_path_2 (str): 第二幅图路径. alpha_value (float): 控制第一张图片占比系数,在区间[0, 1]. 返回值: None: 只展示最终效果图. """ # 导入库 & 初始化变量 import cv2 from pathlib import Path path_check = lambda pth : str(Path(pth).resolve()) try: im1 = cv2.imread(path_check(image_path_1)) im2 = cv2.imread(path_check(image_path_2)) assert isinstance(im1,np.ndarray) and isinstance(im2,np.ndarray),"无法加载其中一个文件" h,w,c = min(im1.shape[:-1],im2.shape[:-1]) resized_im1=cv2.resize(src=im1,dsize=(w,h)) resized_im2=cv2.resize(src=im2,dsize=(w,h)) beta_val = 1-alpha_value blended_image = cv2.addWeighted(resized_im1,alpha_value,resized_im2,beta_val,gamma=0.0) cv2.namedWindow("Blended Image",flags=cv2.WINDOW_NORMAL | cv2.WINDOW_GUI_EXPANDED ) cv2.imshow(winname="Blended Image",mat=blended_image) keypress_result = cv2.waitKeyEx(delay=-1)&0xFF if(keypress_result==ord('q')): pass elif(keypress_result==27): # ESC 键退出循环 raise KeyboardInterrupt() except Exception as e: print(f"Error Occurred:{e}") finally: cv2.destroyAllWindows() blend_images('image1.jpg','image2.jpg',alpha_value=.5) ``` 这里定义了一个名为 `blend_images()` 的函数用于接收两个图像以及它们各自的比重因子作为参数,从而计算出一个新的综合版本^。 --- ### 总结 以上三种技术涵盖了从基础到高级的不同层次的需求。无论是简单的排列摆放还是更加精细的艺术化加工都可以找到合适的解决方案。每种方案都有各自的特点及其适用场景,请依据实际项目情况选取最恰当的一种实施即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值