最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ OpenCV實(shí)現(xiàn)圖像去水印功能

 更新時(shí)間:2022年01月14日 08:33:42   作者:Zero___Chen  
本文將介紹如何使用OpenCV C++ 進(jìn)行簡(jiǎn)單圖像水印去除。我們?cè)诰W(wǎng)上download圖片時(shí),經(jīng)常因?yàn)榘鏅?quán)問(wèn)題有水印。本案例通過(guò)編寫算法進(jìn)行簡(jiǎn)單水印去除。需要的可以參考一下

前言

本文將使用OpenCV C++ 進(jìn)行簡(jiǎn)單圖像水印去除。我們?cè)诰W(wǎng)上download圖片時(shí),經(jīng)常因?yàn)榘鏅?quán)問(wèn)題有水印。本案例通過(guò)編寫算法進(jìn)行簡(jiǎn)單水印去除。

一、水印定位

如圖所示,圖像左下角、右下角有水印。第一步,我們首先得定位水印所在位置。

	Mat gray;
	cvtColor(src, gray, COLOR_BGR2GRAY);

	//圖像二值化,篩選出白色區(qū)域部分
	Mat thresh;
	threshold(gray, thresh, 220, 255, THRESH_BINARY);

如圖為二值化后得到的效果圖。接下來(lái),我們需要提取水印區(qū)域的像素。

//提取圖片下方的水印,制作掩模圖像
?? ?Mat mask = Mat::zeros(src.size(), CV_8U);
?? ?int height = src.rows;
?? ?int width = src.cols;
?? ?int start = 0.9*height;
?? ?//遍歷圖像像素,提取出水印部分像素,制作掩模圖像
?? ?for (int i = start; i < height; i++)
?? ?{
?? ??? ?uchar*data = thresh.ptr<uchar>(i);
?? ??? ?for (int j = 0; j < width; j++)
?? ??? ?{
?? ??? ??? ?if (data[j] == 255)
?? ??? ??? ?{
?? ??? ??? ??? ?mask.at<uchar>(i, j) = 255;?? ??? ??? ?
?? ??? ??? ?}?? ??? ??? ?
?? ??? ?}
?? ?}

如圖所示,至此我們已經(jīng)得到水印部分的二值掩模圖像。接下來(lái),使用OpenCV 內(nèi)置inpaint API進(jìn)行圖像像素修復(fù)。具體可以參考OpenCV C++案例實(shí)戰(zhàn)十四《圖像修復(fù)》

二、圖像修復(fù)

 //使用inpaint進(jìn)行圖像修復(fù)
    Mat result;
    inpaint(src, mask, result, 1, INPAINT_NS);

如圖所示,這是直接使用提取出的二值掩模進(jìn)行圖像修復(fù)得到的結(jié)果,可以看出效果不是很好。原因是,提取出來(lái)的掩模未能覆蓋完全待修復(fù)像素。故我們需要將掩模圖像進(jìn)行膨脹操作,擴(kuò)大掩模范圍。

    //將掩模進(jìn)行膨脹,使其能夠覆蓋圖像更大區(qū)域
    Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
    dilate(mask, mask, kernel);

如圖為進(jìn)行膨脹過(guò)后的掩模圖像。這時(shí),我們使用這張掩模圖像再進(jìn)行圖像修復(fù)工作,得到效果如圖所示。

三、效果顯示

四、源碼

#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;

/*
void inpaint(
?? ??? ?InputArray src, ? 原圖
?? ??? ?InputArray inpaintMask, 二進(jìn)制掩模,指示要修復(fù)的像素
?? ??? ?OutputArray dst, ?目標(biāo)圖像
?? ??? ?double inpaintRadius, 像素周圍的鄰域補(bǔ)繪。通常,如果要修復(fù)的區(qū)域很小,則使用較小的值僅產(chǎn)生較少模糊
?? ??? ?int flags ? ? INPAINT_NS ?或 INPAINT_TELEA
?? ??? ?)
*/

/*
圖像簡(jiǎn)單水印去除:定位到水印所在位置,將水印部分提取出來(lái)制作二進(jìn)制掩模圖像,使用inpaint API進(jìn)行圖像修復(fù)
*/

int main()
{
?? ?Mat src = imread("test.jpg");
?? ?if (src.empty())
?? ?{
?? ??? ?cout << "No Image!" << endl;
?? ??? ?system("pause");
?? ??? ?return -1;
?? ?}

?? ?Mat gray;
?? ?cvtColor(src, gray, COLOR_BGR2GRAY);

?? ?//圖像二值化,篩選出白色區(qū)域部分
?? ?Mat thresh;
?? ?threshold(gray, thresh, 220, 255, THRESH_BINARY);

?? ?//提取圖片下方的水印,制作掩模圖像
?? ?Mat mask = Mat::zeros(src.size(), CV_8U);
?? ?int height = src.rows;
?? ?int width = src.cols;
?? ?int start = 0.9*height;
?? ?//遍歷圖像像素,提取出水印部分像素,制作掩模圖像
?? ?for (int i = start; i < height; i++)
?? ?{
?? ??? ?uchar*data = thresh.ptr<uchar>(i);
?? ??? ?for (int j = 0; j < width; j++)
?? ??? ?{
?? ??? ??? ?if (data[j] == 255)
?? ??? ??? ?{
?? ??? ??? ??? ?mask.at<uchar>(i, j) = 255;?? ??? ??? ?
?? ??? ??? ?}?? ??? ??? ?
?? ??? ?}
?? ?}

?? ?//將掩模進(jìn)行膨脹,使其能夠覆蓋圖像更大區(qū)域
?? ?Mat kernel = getStructuringElement(MORPH_RECT, Size(5, 5));
?? ?dilate(mask, mask, kernel);

?? ?//使用inpaint進(jìn)行圖像修復(fù)
?? ?Mat result;
?? ?inpaint(src, mask, result, 1, INPAINT_NS);

?? ?imshow("mask", mask);
?? ?imshow("test", result);
?? ?waitKey(0);
?? ?system("pause");
?? ?return 0;
}

總結(jié)

本文使用OpenCV C++ 進(jìn)行簡(jiǎn)單圖像水印去除,關(guān)鍵步驟有以下幾點(diǎn)。

1、定位水印位置,制作二值掩模圖像。

2、進(jìn)行圖像像素修復(fù)。

到此這篇關(guān)于C++ OpenCV實(shí)現(xiàn)圖像去水印功能的文章就介紹到這了,更多相關(guān)C++ OpenCV圖像去水印內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • MATLAB實(shí)現(xiàn)五子棋游戲(雙人對(duì)戰(zhàn)、可悔棋)

    MATLAB實(shí)現(xiàn)五子棋游戲(雙人對(duì)戰(zhàn)、可悔棋)

    這篇文章主要為大家詳細(xì)介紹了MATLAB實(shí)現(xiàn)五子棋游戲,可以進(jìn)行雙人對(duì)戰(zhàn)、也可悔棋,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2019-06-06
  • C++ MD5的源碼實(shí)例詳解

    C++ MD5的源碼實(shí)例詳解

    這篇文章主要介紹了C++ MD5的源碼實(shí)例詳解的相關(guān)資料,需要的朋友可以參考下
    2017-01-01
  • 矩陣的行主序與列主序的分析

    矩陣的行主序與列主序的分析

    這篇文章主要介紹了矩陣的行主序與列主序的分析的相關(guān)資料,需要的朋友可以參考下
    2017-07-07
  • C++11新特性之變長(zhǎng)參數(shù)模板詳解

    C++11新特性之變長(zhǎng)參數(shù)模板詳解

    本文主要介紹了C++11變長(zhǎng)參數(shù)模板,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2021-08-08
  • C/C++函數(shù)調(diào)用的幾種方式總結(jié)

    C/C++函數(shù)調(diào)用的幾種方式總結(jié)

    本篇文章主要是對(duì)C/C++函數(shù)調(diào)用的幾種方式進(jìn)行了詳細(xì)的總結(jié)介紹,需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助
    2013-12-12
  • C語(yǔ)言入門之浮點(diǎn)數(shù)

    C語(yǔ)言入門之浮點(diǎn)數(shù)

    這篇文章主要為大家介紹了C語(yǔ)言的浮點(diǎn)數(shù),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2021-12-12
  • C++中Covariant返回值類型詳解

    C++中Covariant返回值類型詳解

    這篇文章主要介紹了C++中Covariant返回值類型詳解,文章圍繞主題展開(kāi)詳細(xì)的內(nèi)容介紹,具有一定的參考價(jià)值,需要的朋友可以可以參考一下
    2022-09-09
  • C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問(wèn)題

    C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問(wèn)題

    這篇文章主要給大家介紹了關(guān)于如何利用C++解決輸出鏈表中倒數(shù)k個(gè)結(jié)點(diǎn)的問(wèn)題,文中通過(guò)實(shí)例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用C++具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下
    2021-12-12
  • EasyC++靜態(tài)持續(xù)變量

    EasyC++靜態(tài)持續(xù)變量

    這篇文章主要介紹了EasyC++靜態(tài)持續(xù)變量,除了自動(dòng)存儲(chǔ)變量之后,C++當(dāng)中還有靜態(tài)持續(xù)變量。關(guān)于靜態(tài)持續(xù)變量的定義C++和C語(yǔ)言是一樣的,它擁有三種鏈接性,即外部鏈接性、內(nèi)部連接性和無(wú)鏈接性,下面一起進(jìn)入文章了解更具體內(nèi)容吧
    2021-12-12
  • C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼

    C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼

    在C語(yǔ)言中,printf 函數(shù)可以直接實(shí)現(xiàn)部分進(jìn)制轉(zhuǎn)換功能,通過(guò)格式說(shuō)明符(format specifier)快速輸出不同進(jìn)制的數(shù)值,下面給大家分享C++使用printf語(yǔ)句實(shí)現(xiàn)進(jìn)制轉(zhuǎn)換的示例代碼,感興趣的朋友一起看看吧
    2025-04-04

最新評(píng)論

济阳县| 建平县| 扶绥县| 高淳县| 芮城县| 河北省| 昭觉县| 界首市| 界首市| 红桥区| 漯河市| 台北县| 桐柏县| 油尖旺区| 太原市| 永宁县| 许昌县| 鄂温| 兴国县| 哈密市| 晋城| 二连浩特市| 清镇市| 基隆市| 长治市| 西宁市| 曲靖市| 紫金县| 金塔县| 左贡县| 裕民县| 钦州市| 舞阳县| 正镶白旗| 襄樊市| 建阳市| 长葛市| 忻州市| 昆明市| 额尔古纳市| 昌图县|