欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Opencv圖像處理之詳解掩膜mask

 更新時(shí)間:2021年03月21日 10:34:51   作者:山水之間2018  
這篇文章主要介紹了Opencv圖像處理之詳解掩膜mask,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1.在OpenCV中我們經(jīng)常會(huì)遇到一個(gè)名字:Mask(掩膜)。很多函數(shù)都使用到它,那么這個(gè)Mask到底什么呢?

2.如果我們想要裁剪圖像中任意形狀的區(qū)域時(shí),應(yīng)該怎么辦呢?
答案是,使用掩膜(masking)。
我們先看一下掩膜的基礎(chǔ)。圖像的位運(yùn)算。

圖像基本運(yùn)算

圖像的基本運(yùn)算有很多種,比如兩幅圖像可以相加、相減、相乘、相除、位運(yùn)算、平方根、對(duì)數(shù)、絕對(duì)值等;圖像也可以放大、縮小、旋轉(zhuǎn),還可以截取其中的一部分作為ROI(感興趣區(qū)域)進(jìn)行操作,各個(gè)顏色通道還可以分別提取及對(duì)各個(gè)顏色通道進(jìn)行各種運(yùn)算操作??傊?,對(duì)于圖像可以進(jìn)行的基本運(yùn)算非常的多,只是挑了些常用的操作詳解。

bitwise_and、bitwise_or、bitwise_xor、bitwise_not這四個(gè)按位操作函數(shù)。
void bitwise_and(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 & src2
void bitwise_or(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 | src2
void bitwise_xor(InputArray src1, InputArray src2,OutputArray dst, InputArray mask=noArray()); //dst = src1 ^ src2
void bitwise_not(InputArray src, OutputArray dst,InputArray mask=noArray()); //dst = ~src

上述的基本操作中都屬于將基礎(chǔ)數(shù)學(xué)運(yùn)算應(yīng)用于圖像像素的處理中,下面將著重介紹

bitwise_and是對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行“與”操作,即對(duì)圖像(灰度圖像或彩色圖像均可)每個(gè)像素值進(jìn)行二進(jìn)制“與”操作,1&1=1,1&0=0,0&1=0,0&0=0
bitwise_or是對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行“或”操作,即對(duì)圖像(灰度圖像或彩色圖像均可)每個(gè)像素值進(jìn)行二進(jìn)制“或”操作,1|1=1,1|0=0,0|1=0,0|0=0
bitwise_xor是對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行“異或”操作,即對(duì)圖像(灰度圖像或彩色圖像均可)每個(gè)像素值進(jìn)行二進(jìn)制“異或”操作,1^1=0,1^0=1,0^1=1,0^0=0
bitwise_not是對(duì)二進(jìn)制數(shù)據(jù)進(jìn)行“非”操作,即對(duì)圖像(灰度圖像或彩色圖像均可)每個(gè)像素值進(jìn)行二進(jìn)制“非”操作,~1=0,~0=1

為了便于大家進(jìn)一步理解,下面給出測試代碼:

# opencv 圖像的基本運(yùn)算
 
# 導(dǎo)入庫
import numpy as np
import argparse
import cv2
 
# 構(gòu)建參數(shù)解析器
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
 
# 加載圖像
image = cv2.imread(args["image"])
cv2.imshow("image loaded", image)
 
# 創(chuàng)建矩形區(qū)域,填充白色255
rectangle = np.zeros(image.shape[0:2], dtype="uint8")
cv2.rectangle(rectangle, (25, 25), (275, 275), 255, -1) # 修改這里
cv2.imshow("Rectangle", rectangle)
 
# 創(chuàng)建圓形區(qū)域,填充白色255
circle = np.zeros(image.shape[0:2], dtype="uint8")
cv2.circle(circle, (150, 150), 150, 255, -1) # 修改
cv2.imshow("Circle", circle)
 
 
# 在此例(二值圖像)中,以下的0表示黑色像素值0, 1表示白色像素值255
# 位與運(yùn)算,與常識(shí)相同,有0則為0, 均無0則為1
bitwiseAnd = cv2.bitwise_and(rectangle, circle)
cv2.imshow("AND", bitwiseAnd)
cv2.waitKey(0)
 
 
 
# 非運(yùn)算,非0為1, 非1為0
bitwiseNot = cv2.bitwise_not(circle)
cv2.imshow("NOT", bitwiseNot)
cv2.waitKey(0)
 
# 或運(yùn)算,有1則為1, 全為0則為0
bitwiseOr = cv2.bitwise_or(rectangle, circle)
cv2.imshow("OR", bitwiseOr)
cv2.waitKey(0)
 
# 異或運(yùn)算,不同為1, 相同為0
bitwiseXor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow("XOR", bitwiseXor)
cv2.waitKey(0)
 
 

可以看到,原圖是一張星空夜景圖。

效果如下:




為了便于展示,后面我只截取部分區(qū)域效果:



掩膜(mask)

在有些圖像處理的函數(shù)中有的參數(shù)里面會(huì)有mask參數(shù),即此函數(shù)支持掩膜操作,首先何為掩膜以及有什么用,如下:
數(shù)字圖像處理中的掩膜的概念是借鑒于PCB制版的過程,在半導(dǎo)體制造中,許多芯片工藝步驟采用光刻技術(shù),用于這些步驟的圖形“底片”稱為掩膜(也稱作“掩?!保?,其作用是:在硅片上選定的區(qū)域中對(duì)一個(gè)不透明的圖形模板遮蓋,繼而下面的腐蝕或擴(kuò)散將只影響選定的區(qū)域以外的區(qū)域。
圖像掩膜與其類似,用選定的圖像、圖形或物體,對(duì)處理的圖像(全部或局部)進(jìn)行遮擋,來控制圖像處理的區(qū)域或處理過程。

數(shù)字圖像處理中,掩模為二維矩陣數(shù)組,有時(shí)也用多值圖像,圖像掩模主要用于:
①提取感興趣區(qū),用預(yù)先制作的感興趣區(qū)掩模與待處理圖像相乘,得到感興趣區(qū)圖像,感興趣區(qū)內(nèi)圖像值保持不變,而區(qū)外圖像值都為0。
②屏蔽作用,用掩模對(duì)圖像上某些區(qū)域作屏蔽,使其不參加處理或不參加處理參數(shù)的計(jì)算,或僅對(duì)屏蔽區(qū)作處理或統(tǒng)計(jì)。
③結(jié)構(gòu)特征提取,用相似性變量或圖像匹配方法檢測和提取圖像中與掩模相似的結(jié)構(gòu)特征。
④特殊形狀圖像的制作。

在所有圖像基本運(yùn)算的操作函數(shù)中,凡是帶有掩膜(mask)的處理函數(shù),其掩膜都參與運(yùn)算(輸入圖像運(yùn)算完之后再與掩膜圖像或矩陣運(yùn)算)。

掩膜實(shí)例

如開篇所提問題2,要對(duì)一幅圖進(jìn)行摳圖(裁剪)操作,這就要用到Mask了,那么就以摳圖為例,解釋Mask在里面的作用。同樣以上圖為例,從原圖中裁剪小樹。

我們利用OR結(jié)果(其他結(jié)果也行),修改調(diào)整后,

代碼如下:

# opencv 圖像的基本運(yùn)算
 
# 導(dǎo)入庫
import numpy as np
import argparse
import cv2
 
# 構(gòu)建參數(shù)解析器
ap = argparse.ArgumentParser()
ap.add_argument("-i", "--image", required=True, help="Path to the image")
args = vars(ap.parse_args())
 
# 加載圖像
image = cv2.imread(args["image"])
cv2.imshow("image loaded", image)
 
# 創(chuàng)建矩形區(qū)域,填充白色255
rectangle = np.zeros(image.shape[0:2], dtype="uint8")
cv2.rectangle(rectangle, (360, 348), (660, 570), 255, -1) # 修改這里
cv2.imshow("Rectangle", rectangle)
 
# 創(chuàng)建圓形區(qū)域,填充白色255
circle = np.zeros(image.shape[0:2], dtype="uint8")
cv2.circle(circle, (520, 455), 140, 255, -1) # 修改
cv2.imshow("Circle", circle)
 
''' 
# 在此例(二值圖像)中,以下的0表示黑色像素值0, 1表示白色像素值255
# 位與運(yùn)算,與常識(shí)相同,有0則為0, 均無0則為1
bitwiseAnd = cv2.bitwise_and(rectangle, circle)
cv2.imshow("AND", bitwiseAnd)
cv2.waitKey(0)
# 非運(yùn)算,非0為1, 非1為0
bitwiseNot = cv2.bitwise_not(circle)
cv2.imshow("NOT", bitwiseNot)
cv2.waitKey(0)
# 異或運(yùn)算,不同為1, 相同為0
bitwiseXor = cv2.bitwise_xor(rectangle, circle)
cv2.imshow("XOR", bitwiseXor)
cv2.waitKey(0)
'''
# 或運(yùn)算,有1則為1, 全為0則為0
bitwiseOr = cv2.bitwise_or(rectangle, circle)
cv2.imshow("OR", bitwiseOr)
cv2.waitKey(0)
# 使用mask
mask = bitwiseOr
cv2.imshow("Mask", mask)
 
# Apply out mask -- notice how only the person in the image is cropped out
masked = cv2.bitwise_and(image, image, mask=mask)
cv2.imshow("Mask Applied to Image", masked)
cv2.waitKey(0)

結(jié)果展示:




簡單說就是:

與或非異或運(yùn)算與我們的常識(shí)類似。掩膜操作就是兩幅圖像(numpy數(shù)組)的位運(yùn)算操作。

附錄:C++ 版

#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>
#include <stdio.h>
 
using namespace std;
using namespace cv;
 
int main()
{
  Mat image, mask;
  Rect r1(100, 100, 250, 300);
  Mat img1, img2, img3, img4;
  image = imread("lol17.jpg");
  mask = Mat::zeros(image.size(), CV_8UC1);
  mask(r1).setTo(255);
  img1 = image(r1);
  image.copyTo(img2, mask);
 
  image.copyTo(img3);
  img3.setTo(0, mask);
 
 
  imshow("Image sequence", image);
  imshow("img1", img1);
  imshow("img2", img2);
  imshow("img3", img3);
  imshow("mask", mask);
 
  waitKey();
  return 0;
}

原始圖:


注意程序中的這兩句關(guān)于Mask的操作。

mask = Mat::zeros(image.size(), CV_8UC1); 
mask(r1).setTo(255); //r1是設(shè)置好的感興趣區(qū)域

解釋一下上面兩句的操作。

第一步建立與原圖一樣大小的mask圖像,并將所有像素初始化為0,因此全圖成了一張全黑色圖。第二步將mask圖中的r1區(qū)域的所有像素值設(shè)置為255,也就是整個(gè)r1區(qū)域變成了白色。

這樣就能得到Mask圖像了。

注意這句,哪個(gè)圖像拷貝到哪個(gè)圖像?

image.copyTo(img2, mask);

當(dāng)然是原始圖image拷貝到目的圖img2上。
其實(shí)拷貝的動(dòng)作完整版本是這樣的:

原圖(image)與掩膜(mask)進(jìn)行與運(yùn)算后得到了結(jié)果圖(img2)。

何為圖與掩膜的與運(yùn)算?

其實(shí)就是原圖中的每個(gè)像素和掩膜中的每個(gè)對(duì)應(yīng)像素進(jìn)行與運(yùn)算。比如1 & 1 = 1;1 & 0 = 0;

比如一個(gè)3 * 3的圖像與3 * 3的掩膜進(jìn)行運(yùn)算,得到的結(jié)果圖像就是:

說白了,mask就是位圖啊,來選擇哪個(gè)像素允許拷貝,哪個(gè)像素不允許拷貝。如果mask像素的值是非0的,我就拷貝它,否則不拷貝。

因?yàn)槲覀兩厦娴玫降膍ask中,感興趣的區(qū)域是白色的,表明感興趣區(qū)域的像素都是非0,而非感興趣區(qū)域都是黑色,表明那些區(qū)域的像素都是0。一旦原圖與mask圖進(jìn)行與運(yùn)算后,得到的結(jié)果圖只留下原始圖感興趣區(qū)域的圖像了。也正如下圖所示。

image.copyTo(img2, mask);

如果想要直接摳出目標(biāo)區(qū)域,直接這樣寫就OK了:

img1 = image(r1);

參考文獻(xiàn):

1.https://www.cnblogs.com/skyfsm/p/6894685.html

到此這篇關(guān)于Opencv圖像處理之詳解掩膜mask的文章就介紹到這了,更多相關(guān)Opencv 掩膜內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Python創(chuàng)建臨時(shí)文件和文件夾

    Python創(chuàng)建臨時(shí)文件和文件夾

    這篇文章主要介紹了Python如何創(chuàng)建臨時(shí)文件和文件夾,文中講解非常細(xì)致,代碼幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下
    2020-08-08
  • python實(shí)現(xiàn)心型照片墻效果

    python實(shí)現(xiàn)心型照片墻效果

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)心型照片墻效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2021-09-09
  • python將Dataframe格式的數(shù)據(jù)寫入opengauss數(shù)據(jù)庫并查詢

    python將Dataframe格式的數(shù)據(jù)寫入opengauss數(shù)據(jù)庫并查詢

    這篇文章主要介紹了python將Dataframe格式的數(shù)據(jù)寫入opengauss數(shù)據(jù)庫并查詢,文章介紹詳細(xì)具有一定的參考價(jià)值,希望對(duì)你的學(xué)習(xí)有所幫助
    2022-04-04
  • python?import模塊時(shí)有錯(cuò)誤紅線的原因

    python?import模塊時(shí)有錯(cuò)誤紅線的原因

    這篇文章主要介紹了python?import模塊時(shí)有錯(cuò)誤紅線的原因及解決,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • python二叉樹遍歷的實(shí)現(xiàn)方法

    python二叉樹遍歷的實(shí)現(xiàn)方法

    這篇文章主要介紹了python二叉樹遍歷的實(shí)現(xiàn)方法,使用了三種遍歷:先序遍歷,中序遍歷,后序遍歷,方法大家參考使用
    2013-11-11
  • PyQt5使用QtDesigner實(shí)現(xiàn)多界面切換程序的全過程

    PyQt5使用QtDesigner實(shí)現(xiàn)多界面切換程序的全過程

    Pyqt5是Python中一個(gè)可視化超級(jí)好用的庫,下面這篇文章主要給大家介紹了關(guān)于PyQt5使用QtDesigner實(shí)現(xiàn)多界面切換程序的相關(guān)資料,文中通過圖文介紹的非常詳細(xì),需要的朋友可以參考下
    2023-06-06
  • OpenCV圖像顏色反轉(zhuǎn)算法詳解

    OpenCV圖像顏色反轉(zhuǎn)算法詳解

    這篇文章主要介紹了OpenCV圖像顏色反轉(zhuǎn)算法詳解,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-05-05
  • python中opencv?Canny邊緣檢測

    python中opencv?Canny邊緣檢測

    這篇文章主要介紹了python中opencv?Canny邊緣檢測,Canny邊緣檢測是一種使用多級(jí)邊緣檢測算法檢測邊緣的方法。OpenCV提供了函數(shù)cv2.Canny()實(shí)現(xiàn)Canny邊緣檢測。更多相關(guān)內(nèi)容需要的小伙伴可以參考下面文章內(nèi)容
    2022-06-06
  • flask-restful使用總結(jié)

    flask-restful使用總結(jié)

    Flask-RESTful是一個(gè)用于快速創(chuàng)建RESTful API接口的Flask擴(kuò)展。,這篇文章主要介紹了flask-restful使用總結(jié),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2018-12-12
  • python求最大值,不使用內(nèi)置函數(shù)的實(shí)現(xiàn)方法

    python求最大值,不使用內(nèi)置函數(shù)的實(shí)現(xiàn)方法

    今天小編就為大家分享一篇python求最大值,不使用內(nèi)置函數(shù)的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評(píng)論