zoukankan      html  css  js  c++  java
  • python-opencv-图像的按位运算

    OpenCV中为我们提供了四种按位运算,分别是按位与、按位或、按位非和按位异或。图像的按位运算本质上就是对像素点值的按位运算,接触过计算机知识的人应该知道,按位运算是针对二进制数而言的,也就是说只有0和1两个值,因此,我们在对图像进行按位运算时,需要将图像转化成灰度图。

    假设现在我们有一张五环图像,我们要用它给其他图像做水印,但是它的底色是纯白色的,我们首先需要处理底色。

    ·阈值二值化
    灰度图共分256(0~255)阶,从按位运算的角度出发,纯黑色为0,不是纯黑色为1。因此当碰到纯白色或者纯黑色的背景时,我们可以先将其转为灰度图,再利用阈值将非背景色的内容抠出来作为模板,再与原图做位操作,进行枢图

    在OpenCV中,我们使用threshold(src,thresh,maxval,type,dst=None)函数来实现图像的固定阈值二值化,即将图像中阈值内的图形抠出

    import cv2
    
    logo = cv2.imread("wuhuan.jpg",1)
    height,width =logo.shape[0], logo.shape[1]
    gray=cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)  #将logo转为灰度
    cv2.imshow('gray', gray)
    ret, mask =cv2.threshold(gray,240,255, cv2.THRESH_BINARY)
    '''
    参数1 必选参数。表示输入图像,注意只能是灰度图
    参数2 必选参数。表示要设置的阈值,也是整个函数最关键的参数。
    参数3 必选参数。当像素值超过阈值或小于阈值(具体根据type来决定)时所赋予的值。
    参数4 必选参数。二值化操作的类型:
            THRESH_BINARY(超过阈值时的像素值为maxval(参数3),否则为0)
            THRESH_BINARY_INV(小于阈值的像素值为maxval(参数3),否则为0)
    函数有两个返回值,其中ret就是我们设置的阈值,mask为经过阈值二值化处理后的图像
    '''
    cv2.imshow('dst', mask)
    cv2.waitKey()

    效果图:

    按位非:

    import cv2
    
    logo = cv2.imread("wuhuan.jpg",1)
    height,width =logo.shape[0], logo.shape[1]
    gray=cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
    ret, mask =cv2.threshold(gray,240,255, cv2.THRESH_BINARY)
    cv2.imshow('yuan', mask)
    mask_inv = cv2.bitwise_not(mask)  #图像按位非操作
    #按位非操作其实就是对像素值取反,原来是1的变为0,原来是0的变为1。
    cv2. imshow('dst', mask_inv)
    cv2.waitKey()

    效果图:

    按位与: 

    import cv2
    
    logo = cv2.imread("wuhuan.jpg",1)
    cv2.imshow('wuhuan', logo)
    height,width =logo.shape[0], logo.shape[1]
    gray=cv2.cvtColor(logo,cv2.COLOR_BGR2GRAY)
    ret, mask =cv2.threshold(gray,240,255, cv2.THRESH_BINARY)
    
    mask_inv = cv2.bitwise_not(mask)
    logo_bg=cv2.bitwise_and(logo,logo,mask=mask_inv)  #按位与--带掩码
    #mask起掩码作用,当mask像素不为0时,做正常与操作,当mask像素为0时直接做0处理
    #【mask为黑白图像时:纯白色部分进行正常的按位操作,mask为非纯白色部分设置为0即黑色】
    cv2. imshow('mask_inv', mask_inv)
    cv2.imshow('dsy', logo_bg)
    cv2.waitKey()

    按位与运算法则如下(&为按位与运算符):1&1=1,1&0=0,0&1=0,0&0=0

    效果图:

  • 相关阅读:
    AIO系列文档(2)----TIO使用
    AIO系列文档(1)----图解ByteBuffer
    Dubbo+zookeeper构建高可用分布式集群(二)-集群部署
    Dubbo+zookeeper构建高可用分布式集群(一)-单机部署
    利用redis + lua解决抢红包高并发的问题
    使用SIP Servlet为Java EE添加语音功能
    Java互联网架构-直播互动平台高并发分布式架构应用设计
    搭建自己的SIP服务器:开源sip服务器opensips的搭建及终端TwInkle的使用
    SIP协议搭建电信级VOIP/IM运营平台--架构篇(sip集群)
    阿里分布式事务解决方案-GTS
  • 原文地址:https://www.cnblogs.com/liming19680104/p/12235430.html
Copyright © 2011-2022 走看看