Python+OpenCV系列:图像的位运算

文章目录

        • 引言
      • 1. 位运算简介
      • 2. OpenCV 中的位运算
        • 2.1 按位与运算:`cv2.bitwise_and()`
        • 2.2 按位或运算:`cv2.bitwise_or()`
        • 2.3 按位异或运算:`cv2.bitwise_xor()`
        • 2.4 按位取反运算:`cv2.bitwise_not()`
      • 3. 位运算在图像处理中的应用
        • 3.1 图像掩模与分割
        • 3.2 图像合成
      • 4. 总结

引言

位运算是计算机科学中一种基础而高效的操作,它直接对二进制位进行处理。在图像处理中,位运算也是一种重要的技术,尤其在图像的合成、分离、掩模处理等场景中,常常用到位运算。Python 的 OpenCV 库提供了多种位运算操作,使得图像处理更加简便和高效。

本文将介绍图像处理中的常见位运算操作,并通过 OpenCV 提供的接口展示如何在实际应用中进行图像的位运算。


1. 位运算简介

位运算是对数字的二进制表示直接进行操作。常见的位运算符包括:

  • 按位与 (&):只有两个操作数相同位为1时,结果才为1。
  • 按位或 (|):只要有一个操作数相应位为1,结果就为1。
  • 按位异或 (^):当两个操作数对应位不同时,结果为1,否则为0。
  • 按位取反 (~):对操作数每一位取反(0变1,1变0)。
  • 按位左移 (<<):将操作数的二进制位向左移动指定的位数。
  • 按位右移 (>>):将操作数的二进制位向右移动指定的位数。

在图像处理中,位运算通常用于以下场景:

  • 图像的掩模操作(遮罩)
  • 合成图像
  • 提取特定图像区域
  • 图像对比

2. OpenCV 中的位运算

OpenCV 提供了多种函数来实现图像的位运算。常用的位运算函数有 cv2.bitwise_and(), cv2.bitwise_or(), cv2.bitwise_xor(), cv2.bitwise_not()。这些函数可以对图像的每个像素进行按位操作。

2.1 按位与运算:cv2.bitwise_and()

按位与运算是两个图像对应像素进行“与”操作,只有当两个像素值的对应位都为1时,结果才为1。通常用于图像的掩模操作。

import cv2
import numpy as np# 读取图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')# 进行按位与运算
result = cv2.bitwise_and(img1, img2)# 显示结果
cv2.imshow('Bitwise AND', result)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,cv2.bitwise_and() 函数将 img1img2 图像的对应像素进行按位与运算,生成一个新的图像 result。只有两个图像的像素值同时为1时,结果的对应像素才为1。

2.2 按位或运算:cv2.bitwise_or()

按位或运算是将两个图像的对应像素进行“或”操作,只要一个像素值的对应位为1,结果的像素就为1。

# 进行按位或运算
result_or = cv2.bitwise_or(img1, img2)# 显示结果
cv2.imshow('Bitwise OR', result_or)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.bitwise_or() 函数对两个图像的每个像素进行按位或操作,最终生成的新图像中,任何一个像素值为1的地方都会在结果图像中保持为1。

2.3 按位异或运算:cv2.bitwise_xor()

按位异或运算将两个图像的像素进行“异或”操作,当对应像素的值不同(一个为1,另一个为0)时,结果为1。

# 进行按位异或运算
result_xor = cv2.bitwise_xor(img1, img2)# 显示结果
cv2.imshow('Bitwise XOR', result_xor)
cv2.waitKey(0)
cv2.destroyAllWindows()

cv2.bitwise_xor() 会将两个图像中像素值不相同的位置置为1,相同的置为0。该操作在图像对比和差异分析中非常有用。

2.4 按位取反运算:cv2.bitwise_not()

按位取反运算是将图像中所有像素的二进制位反转,0变为1,1变为0。该操作可以用于图像的反转处理。

# 进行按位取反运算
result_not = cv2.bitwise_not(img1)# 显示结果
cv2.imshow('Bitwise NOT', result_not)
cv2.waitKey(0)
cv2.destroyAllWindows()

在此代码中,cv2.bitwise_not()img1 图像的所有像素进行取反,生成新图像 result_not


3. 位运算在图像处理中的应用

3.1 图像掩模与分割

位运算常用于图像的掩模处理。在许多图像处理任务中,我们只关心图像中的某一部分内容,其他部分则需要被忽略。这时就可以通过按位与(bitwise_and)操作提取出感兴趣的区域。掩模通常是一个二值图像,通过与原图像进行按位与操作,可以只保留需要的区域。

# 创建一个简单的掩模图像
mask = np.zeros_like(img1)
mask[100:400, 100:400] = 255  # 设置感兴趣区域为白色# 应用掩模
result_masked = cv2.bitwise_and(img1, img1, mask=mask)cv2.imshow('Masked Image', result_masked)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这里,掩模图像 mask 定义了感兴趣的区域,通过按位与运算,可以将原图像中不在感兴趣区域内的部分去除。

3.2 图像合成

位运算还可以用于图像的合成。例如,可以通过按位或(bitwise_or)操作将两幅图像合成在一起,创造出一个混合图像。

# 进行图像合成
result_composite = cv2.bitwise_or(img1, img2)cv2.imshow('Composite Image', result_composite)
cv2.waitKey(0)
cv2.destroyAllWindows()

这种方法可以用来合成两幅图像,或者将透明背景的图像叠加到其他图像上。


4. 总结

位运算是图像处理中非常基础和高效的一类操作。通过 OpenCV 提供的 cv2.bitwise_and(), cv2.bitwise_or(), cv2.bitwise_xor(), cv2.bitwise_not() 等函数,用户可以方便地对图像进行各种位运算操作。位运算在图像掩模、合成、提取区域等许多图像处理任务中都有广泛的应用。掌握位运算对于提高图像处理效率和实现复杂图像分析任务至关重要。

希望本文能够帮助你理解并有效使用 OpenCV 中的位运算,为你的图像处理项目增添更多实用的技巧。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/63643.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

高效的 Python Web 开发与数据库操作:基于 FastAPI 的实战与优化

高效的 Python Web 开发与数据库操作&#xff1a;基于 FastAPI 的实战与优化 目录 &#x1f40d; 1. 数据库连接池的使用与管理&#x1f504; 2. 数据库事务的处理与控制&#x1f4a1; 3. FastAPI 中的 ORM 集成与优化 &#x1f40d; 1. 数据库连接池的使用与管理 数据库连接…

D3实现站点路线图demo分享

分享一下通过D3实现的站点路线分布图&#xff0c;这是一个demo。效果图如下&#xff1a; 源码如下&#xff1a; <template><div class"map-test" ref"d3Chart"><div class"tooltip" id"popup-element"><span>…

CTF-WEB: 配置一个Ubuntu 多版本php服务器

今天复现题windows的php /tmp缓存一直是空的,直接配一个新虚拟机 开始 准备一个全新的虚拟机,可以在这里下载镜像 Verifying - USTC Mirrors 走完常规安装流程继续 设置中文(可选) sudo apt install language-pack-zh-hans language-pack-gnome-zh-hans然后在设置->语…

python爬虫--小白篇【爬虫实践】

一、前言 1.1、王者荣耀皮肤爬虫 根据王者荣耀链接&#xff0c;将王者荣耀的全部英雄的全部皮肤图片爬取保存到本地。经过分析得到任务的三个步骤&#xff1a; 根据首页全部英雄列表连接获取全部英雄的名称hero_name以及对应的hero_id&#xff1b;根据单个英雄的hero_name和h…

算法日记 42 day 图论

今天来看看广度优先搜索&#xff0c;并且写几个题。刷到这里我才想起来&#xff0c;当时第一次面试的时候问的就是这个题&#xff0c;当时大概知道一点思路&#xff0c;但不清楚是图论方面的&#xff0c;更别说写出来了。 广度优先搜索&#xff08;BFS&#xff09; 不同于深度…

【NLP 13、实践 ② 判断文本中是否有特定字符出现】

人活着就是为了救赎自己&#xff1b;为了经历世间的美好&#xff1b;为了在挫折中成长变得更坚强 —— 24.12.10 一、定义模型 1.嵌入层 nn.Embedding&#xff1a;将离散值转化为向量 # embedding层&#xff0c;vocab&#xff1a;词表&#xff0c;要多少个数据&#xff08;向…

软件注册机 | QT给自己的桌面软件实现软件注册码功能

之前做的一个项目&#xff0c;想要给软件做一个注册码功能。当软件发布之后&#xff0c;不想给所有人用&#xff0c;这时就可以通过注册机给软件生成授权码来软件加密。整个过程实现分为两大步骤&#xff0c;一是在自己的软件打开时&#xff0c;增加一段判断逻辑&#xff1b;二…

GD32中断

1.什么是中断&#xff1a;打断现在正在做的事&#xff0c;去执行其他事。 2.ARM异常中断结构 3.中断向量编号。中断向量是 进行了映射的&#xff0c;直接映射到 flash中的地址。 4.中断执行结构。向量里面保存的是执行函数的地址。&#xff08;具体可在编译完后的map文件中查看…

三菱FX3U模拟量产品的介绍

FX3u可编程控制器模拟量产品包括&#xff1a;特殊适配器、特殊功能模块的连接 1、连接在FX3U可编程控制器的左侧。 2、连接特殊适配器时&#xff0c;需要功能扩展板。 3、最多可以连接4台模拟量特殊适配器。 4、使用高速输入输出特殊适配器时&#xff0c;请将模拟量特殊适配器连…

WHAT - webpack、vite(rollup)、rsbuild 对比

目录 一、分析二、其他阅读 一、分析 以下是 Webpack、Vite 和 rsbuild 在多个维度上的比较分析表格&#xff1a; 维度WebpackVitersbuild核心语言/技术使用 JavaScript 和 Node.js基于 JavaScript/TypeScript&#xff0c;依赖原生 ESM 和浏览器支持使用 Rust 编写&#xff0…

软件测试丨Appium 源码分析与定制

在本文中&#xff0c;我们将深入Appium的源码&#xff0c;探索它的底层架构、定制化使用方法和给软件测试带来的优势。我们将详细介绍这些技术如何解决实际问题&#xff0c;并与大家分享一些实用的案例&#xff0c;以帮助读者更好地理解和应用这一技术。 Appium简介 什么是App…

【PlantUML系列】流程图(四)

目录 目录 一、基础用法 1.1 开始和结束 1.2 操作步骤 1.3 条件判断 1.4 并行处理 1.5 循环 1.6 分区 1.7 泳道 一、基础用法 1.1 开始和结束 开始一般使用start关键字&#xff1b;结束一般使用stop/end关键字。基础用法包括&#xff1a; start ... stopstart ...…

Linux 串口编程

目录 前言一、tty体系二、串口硬件基础知识三、Linux下的串口编程3.1 打开串口3.2 从串口读写数据,问题1、2的诞生3.3 关闭串口3.4 串口配置3.4.1 获取/设置串口的参数3.4.2 设置波特率3.4.3 设置控制模式标志3.4.4 设置本地模式标志3.4.5 设置输入模式标志3.4.6 设置输出模式标…

️【设计模式】之单例模式详解:创建者模式中的一颗“明珠”

全文目录&#xff1a; 开篇语&#x1f3af; 什么是单例模式&#xff1f;&#x1f5c2;️ 单例模式的关键特性&#x1f511; 单例模式的实现方式1. &#x1f331; 懒汉式单例&#xff08;Lazy Initialization&#xff09;2. &#x1f512; 懒汉式单例&#xff08;线程安全版&…

idea压缩js,css

这是需要的jar包(文章顶部也可以下载) 地址:https://download.csdn.net/download/yuzheh521/90109966?spm1001.2101.3001.9500 压缩js arguments: -jar E:\swj\jar_packages\css_js_compress\yuicompressor-2.4.8.jar --type js --charset utf-8 $FilePath$ -o $FileNameWith…

ASP.NET |日常开发中连接Oracle数据库详解

ASP.NET &#xff5c;日常开发中连接Oracle数据库详解 前言一、安装和配置 Oracle 数据访问组件1.1 安装ODP.NET&#xff08;Oracle Data Provider for.NET&#xff09;&#xff1a;1.2 引用相关程序集&#xff1a; 二、配置连接字符串2.1 连接字符串的基本组成部分&#xff1a…

【linux系统】基础开发工具(yum、Vim)

1. 软件包管理器 1.1 什么是软件包 在Linux下安装软件, ⼀个通常的办法是下载到程序的源代码, 并进⾏编译, 得到可执⾏程序. 但是这样太麻烦了, 于是有些⼈把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序)放在⼀个服务器上, 通过包管理器可以很⽅便的…

C语言:define定义常量和定义宏(详解)

本篇博客给大家带来的是#define定义常量和#define定义宏的方法 &#x1f41f;&#x1f41f;文章专栏&#xff1a;C语言 &#x1f680;&#x1f680;若有问题评论区下讨论&#xff0c;我会及时回答 ❤❤欢迎大家点赞、收藏、分享 你们的支持就是我创造的动力 今日思想&#xff1…

Let up bring up a linux.part2 [十一]

之前的篇幅中我们已经将 Linux 内核 bringup 起来了&#xff0c;不知道大家有没有去尝试将根文件系统运行起来&#xff0c;今天我就带领大家完成这个事情&#xff0c;可以跟着下面的步骤一步步来完成&#xff1a; 在这里我们使用 busybox 构建 rootfs&#xff1a; 下载 busyb…

使用GO--Swagger生成文档

概述 在前后端分离的项目中&#xff0c;后端配置swagger可以很好的帮助前端人员了解后端接口参数和数据传输。go-swagger 是一个功能全面且高性能的Go语言实现工具包&#xff0c;用于处理Swagger 2.0&#xff08;即OpenAPI 2.0&#xff09;规范。它提供了丰富的工具集&#x…