栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

使用opencv和python实现图像的智能处理_python图像边缘opencv?

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

使用opencv和python实现图像的智能处理_python图像边缘opencv?

随着人工智能的不断发展,OpenCV这门技术也越来越重要,很多人都开启了学习OpenCV,本文就介绍了OpenCV的基础内容。

图像运算指以图像为单位进行的搡作(该操作对图像中的所有像素同样进行),运算的结果是一幅其灰度分布与原来参与运算图像灰度分布不同的新图像。具体的运算主要包括算术和逻辑运算,它们通过改变像素的值来得到图像增强的效果。

算术和逻辑运算中每次只涉及一个空间像素的位置,所以可以“原地”完成,即在(x,y)位置做一个算术运算或逻辑运算的结果可以存在其中一个图像的相应位置,因为那个位置在其后的运算中不会再使用。换句话说,设对两幅图像f(x,y) 和h(x,y)的算术或逻辑运算的结果是g(x,y),则可直接将g(x,y)覆盖f(x,y)或h(x,y),即从原存放输入图像的空间直接得到输出图像。

图像的基本运算:相加、相减、相乘、相除、位运算、平方根、对数、绝对值等;
图像也可以放大、缩小、旋转,还可以截取其中的一部分作为ROI(感兴趣区域)进行操作;
各个颜色通道还可以分别提取及对各个颜色通道进行各种运算操作。
· 学习图像上的算术运算,加法,减法,位运算等。
·相关函数:cv2.add(),cv2.addWeighted() 等。

本片文章的目标:

    能够理解图像算术运算的概念能够使用对应函数实现图像加减乘除能够使用加权相加函数实现应用能够理解图像逻辑运算应用场景能够使用相关函数实现图像加密、面部打码、数字水印

01
算数运算

1首先,我们使用加号进行简单的图像运算,使用matplotlib绘图并查看图像像素变化


#导入所需的库
import cv2 
import numpy as np
#读取图像
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
#进行图像简单相加
img3=img1+img2

cv2.imshow("add",img3)
cv2.waitKey()
cv2.destroyAllWindows()

2使用OpenCV自带的函数进行图像运算

#加法运算
def add_demo(m1, m2):
    dst = cv2.add(m1, m2)
    cv2.imshow("add_demo", dst)
#减法运算
def subtract_demo(m1, m2):
    dst = cv2.subtract(m1, m2)
    cv2.imshow("subtract_demo", dst)
#乘法运算
def divide_demo(m1, m2):
    dst = cv2.divide(m1, m2)
    cv2.imshow("divide_demo", dst)
#除法运算
def multiply_demo(m1, m2):
    dst = cv2.multiply(m1, m2)
    cv2.imshow("multiply_demo", dst)
#加权和运算,应用于亮度与对比度调整
def contrast_brightness_demo(image, c, b):
    h, w, ch = image.shape
    blank = np.zeros([h, w, ch], image.dtype)
    dst = cv2.addWeighted(image, c, blank, 1-c, b)
    cv2.imshow("con-bri-demo", dst)
#导入所需的库
import cv2 
import numpy as np
#读取图像
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
add_demo(img1,img2)
subtract_demo(img1,img2)
divide_demo(img1,img2)
multiply_demo(img1,img2)
contrast_brightness_demo(img2,1.2,10)
cv2.waitKey(0)
cv2.destroyAllWindows()





使用cv2.add()将两个图像相加,可以使用numpy中的矩阵加法来实现。
但是在opencv中加法是饱和操作,也就是有上限值,numpy会对结果取模。

3练习:实现ppt页面切换的功能,关键函数:addWeighted()

#导入所需的库
import cv2 
#读取图像
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
l,h=img1.shape[0:2]
a=0
dst=cv2.addWeighted(img1,a,img2,1-a,-1)
while a<1.0:
    dst=cv2.addWeighted(img1,a,img2,1-a,-1.0)
    cv2.imshow('ppt',dst)
    cv2.waitKey(100)
    a+=0.02
cv2.waitKey(0)
cv2.destroyAllWindows()

ppt

02
逻辑运算
#按位与 按位或
def logic_demo(m1, m2):
    dst1 = cv2.bitwise_and(m1, m2)
    dst2 = cv2.bitwise_or(m1, m2)
    cv2.imshow("logic_demo_and", dst1)
    cv2.imshow("logic_demo_or",dst2)
#按位非运算 按位异或
def logic_demo2(m1,m2):
    dst1=cv2.bitwise_not(m1,m2)
    dst2=cv2.bitwise_xor(m1,m2)
    cv2.imshow("logic_demo_not", dst1)
    cv2.imshow("logic_demo_xor",dst2)
#导入所需的库
import cv2 
#实现
img1=cv2.imread("LinuxLogo.jpg")
img2=cv2.imread("WindowsLogo.jpg")
logic_demo(img1,img2)
logic_demo2(img2,img1)
cv2.waitKey(0)
cv2.destroyAllWindows()
03
逻辑运算综合应用




1图像加密

import cv2
import numpy as np
 
demo = cv2.imread("kdx.jpg", 0)
r, c = demo.shape
key = np.random.randint(0, 256, size=(r, c), dtype=np.uint8)   # 生成随机的密钥图像
 
# cv2.imshow("kdx", demo)              # 显示原始图像
cv2.imshow("key", key)                # 显示密钥图像
 
encryption = cv2.bitwise_xor(demo, key)   # 加密
decryption = cv2.bitwise_xor(encryption, key)  # 解密
 
cv2.imshow("jiami", encryption)      # 显示密文图像
cv2.imshow("jiemi", decryption)      # 显示解密后的图像
 
cv2.waitKey(-1)
cv2.destroyAllWindows()



2面部打码以及解码

lena=cv2.imread("kdx.jpg",0)
r,c=lena.shape
mask=np.zeros((r,c),dtype=np.uint8)
mask[320:610,200:545]=1
key=np.random.randint(0,256,size=[r,c],dtype=np.uint8) # 获取密匙

lenaXorKey=cv2.bitwise_xor(lena,key)  # 对原图像加密
encryptFace=cv2.bitwise_and(lenaXorKey,mask*255) # 获取加密图的脸部信息
noFace1=cv2.bitwise_and(lena,(1-mask)*255)     # 将原图的脸部位置置0
maskFace=encryptFace+noFace1                # 得到打码的原图

# 解码
extractOriginal=cv2.bitwise_xor(maskFace,key)   # 得到脸部的原始信息
extractFace=cv2.bitwise_and(extractOriginal,mask*255)  # 提取脸部信息
noFace2=cv2.bitwise_and(maskFace,(1-mask)*255)  # 从打码的原图内提取没有脸的原图
extractLena=noFace2+extractFace     # 得到解码的原图

# 显示图像
# cv2.imshow("lena",lena)
# cv2.imshow("mask",mask*255)          
# cv2.imshow("1-mask",(1-mask)*255)
# cv2.imshow("key",key)
# cv2.imshow("lenaXorKey",lenaXorKey)
# cv2.imshow("encryptFace",encryptFace)
# cv2.imshow("noFace1",noFace1)
# cv2.imshow("maskFace",maskFace)
# cv2.imshow("extractOriginal",extractOriginal)
cv2.imshow("extractFace",extractFace)
cv2.imshow("noFace2",noFace2)
# cv2.imshow("extractLena",extractLena)
cv2.waitKey()
cv2.destroyAllWindows()


04
总结

以上就是今天要讲的内容,本次主要介绍了图像的基本图像运算、图像加权和、按位逻辑运算以及使用它们来掩膜进行图像打码/解码等操作,我们先需要牢靠的掌握基础操作,对于更好的实现图像处理是非常有必要的。


点个关注不迷路
觉得孔哥写的对你有帮助?请分享给更多的人
欢迎一起学习!博客平台同步发布,请搜索——和孔哥一起学

版权声明: 作者: 和孔哥一起学 导师:Fu Xianjun 本文版权归作者导师共有,欢迎转载,但未经作者同意必须在文章页面注明来源及原作者或原文链接,否则保留追究法律责任的权利。
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786855.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号