IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> OpenCV爬坑之路(二)——《OpenCV计算机视觉编程攻略》使用图像掩码问题 -> 正文阅读

[人工智能]OpenCV爬坑之路(二)——《OpenCV计算机视觉编程攻略》使用图像掩码问题


前言

在学习《OpenCV计算机视觉编程攻略》第一章的图像编程入门时,在“使用图像掩码”部分,始终无法得到如书中P19面的扣图后的图片效果,经过尝试,得知是因为图片为彩色图像而logo图为灰度图,导致两者无法完成插入。


提示:以下是本篇文章正文内容,下面案例可供参考

一、出现问题

本人情况如下:
有下两图素材,将图2的smalllogo.png图插入到图1puppy.bmp中,并通过使用图像掩码实现只复制下面logo的白色部分,做到扣图的效果,但出现如图3的效果。

图1 puppy.bmp
图1 puppy.bmp
图2 smalllogo.png
图2 smalllogo.png

图3 失败图
图3 失败图

二、问题解决

1.问题原因

代码如下(示例):

#include "stdio.h"
#include<iostream> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
	
	cv::Mat image = imread("images/puppy.bmp");//imread函数以【BGR形式】读取
	cv::Mat logo= imread("images/smalllogo.png",0);//以【灰度图形式】读取
	cv::Mat imageROI=image(
					cv::Rect(image.cols - logo.cols, //ROI coordinates
					image.rows - logo.rows,
					logo.cols, logo.rows));// ROI size
	cv::Mat mask(logo);//把标志作为掩码(必须是灰度图像)【罪魁祸首】
	logo.copyTo(imageROI,mask);//插入logo,只复制掩码不为0的位置
	imshow("logo", logo);
	imshow("image", image);
	imshow("imageROI", imageROI);
	cv::waitKey(300000);

原因是我看到“把标志作为掩码(必须是灰度图像)”,所以我把图2导入时将它作为一个灰度图像了,这就导致了后面的错误。图1为一个8UC3数据,而图2此时为一个8UC1数据,两者不同。

cv::Mat mask(logo);//把标志作为掩码(必须是灰度图像)【罪魁祸首】

2.解决方法

代码如下:

#include "stdio.h"
#include<iostream> 
#include <opencv2/core/core.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include<opencv2/imgproc/imgproc.hpp>

using namespace std;
using namespace cv;

int main()
{
	
	cv::Mat image = imread("images/puppy.bmp");
	cv::Mat logo= imread("images/smalllogo.png");//【只有这里不同】
	cv::Mat imageROI=image(
					cv::Rect(image.cols - logo.cols, 
					image.rows - logo.rows,
					logo.cols, logo.rows));
	cv::Mat mask(logo);
	logo.copyTo(imageROI,mask);
	imshow("logo", logo);
	imshow("image", image);
	imshow("imageROI", imageROI);
	cv::waitKey(30000);

}

将图2中logo以imread函数直接读取。

彩色状态
图4 将图2logo以imread函数直接读取
灰度状态
图5 将图1与图2以灰度图形式读取

	cv::Mat image = imread("images/puppy.bmp"0);
	cv::Mat logo= imread("images/smalllogo.png"0);

3.相关知识点

1.为啥是BGR,不是RGB格式

OpenCV是英特尔在1999年成立的,当时主流的摄像头制造商和软件供应商提供的摄像头采集的图像的通道排列顺序为BGR,位图BMP是最简单的,也是Windows显示图片的基本格式,其文件扩展名命名为*.bmp 。位图BMP(windows公司的标准格式)格式是BGR的。因为BGR在当时被广泛使用,早期的OpenCV开发者选择了BGR颜色格式,这已经成为今天使用的规范。

2.灰度图像与彩色图像

灰度图像(黑白图像)像素是8位无符号数(unsigned char),0为黑色,255表示白色。 彩色图像需要用三原色来重现不同的可见色。常用的主通道为红色、绿色和蓝色,因此每三个8位数值组成矩阵的一个元素,除了特殊的应用程序可能需要用16位通道(如医学图像),其他的8位通道就够了。

参考

1、https://blog.csdn.net/hacker_long/article/details/88430559
2、《OpenCV计算机视觉编程攻略》

总结

在学习图像掩码过程中,让我学习到了不同的类型的图像之间的差异。单通道图像与三通道图像之间的差异导致他们不能进行掩码操作。
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-09-30 11:56:30  更:2021-09-30 11:58:34 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/21 21:53:04-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码