Opencv實戰【3】——圖像修復與圖像銳化(darling in the franxx)

目錄

    • 前言
    • 圖像修復
    • 圖像銳化
    • darling in the franxx圖片
    • 總結

前言

前天,在群里看見有人發了這張表情包:
表情包
感覺女主有點好看,然后問室友是啥番劇(darling in the franxx),然后就去補番了,然后從晚上十二點看到早上五點多,睡了一覺下午接著看,看完腦子里面全是02,啊啊啊啊,這種番這的太對我的胃口了,墻裂推薦!!!
在網站上截了幾張圖準備做壁紙的,但是這幾張圖片有幾個缺點:
1、有兩張手速不快,截圖上有字
2、由于圖像經過處理有點模糊,細節不夠明顯
于是查了查Opencv有沒有相關的函數可以解決這種問題,發現是有的。
上述的兩種問題分別對應著兩種圖像處理效果:1、圖像修復 2、圖像銳化

圖像修復

圖像修復,指對受到損壞的圖像進行修復重建或者去除圖像中的多余物體。
去除文字,是圖像修復的一種應用。
Opencv自帶inpaint函數:

CV_EXPORTS_W void inpaint( InputArray src, InputArray inpaintMask,OutputArray dst, double inpaintRadius, int flags );

其中
InputArray src 表示要修復的圖像,
InputArray inpaintMask表示修復模板,
OutputArray dst 表示修復后的圖像,
double inpaintRadius 表示修復的半徑,
int flags 表示修復使用的算法 。 opencv提供了兩種選擇 CV_INPAINT_TELEA 和 CV_INPAINT_NS。
這里不詳細講解修復原理,百度或知乎都有相關的原理講解的。

調用inpaint()函數一個關鍵的點:確定修復掩膜。
修復掩膜只能為8位單通道的圖像,其中非零像素表示需要修補的區域。
所以,用閾值法提取的文字圖像作為修復掩膜。雖然閾值法的處理結果可能會導致一些誤檢點或者誤檢區域,但這些誤檢都在可容忍的錯誤范圍之內。而且可用形態學方法中膨脹操作對閾值法提取的結果進行膨脹,膨脹操作的結果再作為修復掩膜。

代碼:
1、確定修復掩膜圖像,觀察像素發現,文字為白色

Mat GetRedComponet(Mat srcImg)
{//如果直接對srcImg處理會改變main()函數中的實參Mat dstImg = srcImg.clone();Mat_<Vec3b>::iterator it = dstImg.begin<Vec3b>();Mat_<Vec3b>::iterator itend = dstImg.end<Vec3b>();for (; it != itend; it++){if ((*it)[2] > 230 && (*it)[1] > 230 && (*it)[2] > 230){(*it)[0] = 255;(*it)[1] = 255;(*it)[2] = 255;//紅色分量保持不變}else{(*it)[0] = 0;(*it)[1] = 0;(*it)[2] = 0;}}return dstImg;
}

2、確定膨脹參數以及修復半徑

void Inpainting(Mat oriImg, Mat maskImg,Mat& inpaintedImage)
{Mat grayMaskImg;Mat element = getStructuringElement(MORPH_ELLIPSE, Size(15, 15));//MORPH_RECT MORPH_CROSS;MORPH_ELLIPSE;dilate(maskImg, maskImg, element);//膨脹后結果作為修復掩膜//將彩色圖轉換為單通道灰度圖,最后一個參數為通道數cvtColor(maskImg, grayMaskImg, COLOR_BGR2GRAY, 1);//修復圖像的掩膜必須為8位單通道圖像inpaintedImage.create(oriImg.size(), oriImg.type());inpaint(oriImg, grayMaskImg, inpaintedImage, 3, INPAINT_NS);     //INPAINT_NS   INPAINT_TELEA
}

3、傳入圖片,展示圖片

int main(int argc, char* argv[])
{Mat srcImg;srcImg=imread("D:\\opencv_picture_test\\darling in the franxx\\02字.png", 1);//獲取掩膜大概區域,之后需要進行膨脹處理,擴大掩膜區域Mat imgComponet = GetRedComponet(srcImg);Mat inpaintedImage;Mat result;//修復Inpainting(srcImg, imgComponet, inpaintedImage);//namedWindow("原圖", WINDOW_NORMAL);   //imshow("原圖", srcImg);namedWindow("圖像復原結果圖", WINDOW_NORMAL);imshow("圖像復原結果圖", inpaintedImage);waitKey(0);return 0;
}

效果:
原圖:
原圖
復原結果
感覺效果還行,不過效果沒有達到做壁紙的效果,唉。。。

圖像銳化

圖像銳化,是使圖像邊緣更清晰的一種圖像處理方法,細節增強(detail enhancement)。
常用的做法是提取圖像的高頻分量,將其疊加到原圖上。
圖像高頻分量的提取有兩種做法,一種是用高通濾波器,得到高頻分量,另一種是通過低通濾波,用原圖減低頻得以高頻。
直接提取高頻的方法有sobel算法、laplcian算子,sobel算子是圖像的一階導數,提取的是梯度信息,分水平和垂直兩種,常常用來做邊緣檢測、方向判別,sobel算子在斜坡處不為0,因此會產生較粗的邊緣。laplcian算子是圖像的二階導,在圖像開始變化和結束變化的地方值不為0,漸變時結果為0,因此laplacian比sobel算子更適合做sharpen。
除了直接提取高頻的方法外,我們也可以先提取低頻,原圖減去低頻得到高頻。這種方法稱為非銳化掩模(unsharpen
mask),我們常使用低通濾波器(高斯、雙邊)對圖像進行濾波,這種方法濾波器很好控制(包括大小和強弱),從而可以控制高頻分量的強弱。

高頻分量提取(濾波)

void sharpenImage( cv::Mat& image, cv::Mat& result)
{//創建并初始化濾波模板,這里使用拉普拉斯模板cv::Mat kernel(3, 3, CV_32F, cv::Scalar(0));kernel.at<float>(1, 1) = 5.0;kernel.at<float>(0, 1) = -1.0;kernel.at<float>(1, 0) = -1.0;kernel.at<float>(1, 2) = -1.0;kernel.at<float>(2, 1) = -1.0;result.create(image.size(), image.type());//對圖像進行濾波cv::filter2D(image, result, image.depth(), kernel);
}

效果:
效果

darling in the franxx圖片

銳化:
02
海灘
夕陽
修復:
莓
02
輪廓或邊緣:
輪廓
邊緣

總結

莓的那張由于字在樹林背景那邊,看起來效果還行。02的那張由于涉及到身體輪廓,以后還需要進行改進。
另外以后手速還是需要練,盡量截到不帶字的圖。
大愛02小寶貝!!!

Reference:

https://www.cnblogs.com/hellowooorld/p/7048614.html
https://blog.csdn.net/zx249388847/article/details/79325385/
https://blog.csdn.net/helimin12345/article/details/82634355
https://blog.csdn.net/hankerbit/article/details/80838241

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/378535.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/378535.shtml
英文地址,請注明出處:http://en.pswp.cn/news/378535.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

python 示例_Python date isoweekday()方法與示例

python 示例Python date.isoweekday()方法 (Python date.isoweekday() Method) date.isoweekday() method is used to manipulate objects of date class of module datetime. date.isoweekday()方法用于處理模塊日期時間的日期類的對象。 It uses a date class object and r…

07-機器學習(Hog+SVM實現小獅子識別)

一、SVM支持向量機 什么是SVM支持向量機&#xff1f; SVM支持向量機本質仍是一個分類器&#xff0c;其核心為尋求一個最優超平面最終實現分類&#xff0c;實現分類問題 在尋求超平面的時候有多種方式&#xff0c;可以使用若干條直線或曲線進行分類&#xff0c;這里使用的是直線…

Net Remoting基礎篇

一、Remoting基礎 什么是Remoting&#xff0c;簡而言之&#xff0c;我們可以將其看作是一種分布式處理方式。從微軟的產品角度來看&#xff0c;可以說Remoting就是DCOM的一種升 級&#xff0c;它改善了很多功能&#xff0c;并極好的融合到.Net平臺下。Microsoft .NET Remoting …

Maven3.0.5代理nexus

Nexus簡介 Nexus是Sonatype推出的強大Maven倉庫管理器產品&#xff0c;要比以前TSS上介紹的Artifactory要好使用的多&#xff0c;也是一個拆箱即用的Java App&#xff0c;內嵌Jetty容器和Java Wrapper做Windows服務&#xff0c;安裝簡單到解壓然后雙擊install即可。更詳細的幫助…

8253譯碼電路設計以及初始化編程講解

先驗知識回顧&#xff1a;知識點不清晰的時候可以查詢相關知識點。 https://blog.csdn.net/qq_42604176/article/details/105810973 需掌握的主要知識點 1、譯碼電路設計 2、初始化編程 例題1 在以 8086構成的最大方式系統中&#xff0c;有一片8254的端口地址分別為301H、3…

java安卓寫文件路徑,如何使用gradle作為構建系統,平臺Android配置Protobuf(Java)文件的輸出路徑?...

我正在努力解決以下問題&#xff1a;我有2個基于maven的java項目和1個基于gradle的Android項目 . 布局如下&#xff1a;Workspace/├── MavenProj1/├── MavenProj2/├── AndroidGradleProject1/├── Protos/所有這些的包結構很常見&#xff0c;比方說 com.example.* 所…

Java System類exit()方法及示例

系統類exit()方法 (System class exit() method) exit() method is available in java.lang package. exit()方法在java.lang包中可用。 exit() method is used to exit the currently running JVM (Java Virtual Machine). exit()方法用于退出當前正在運行的JVM(Java虛擬機)。…

基于圖像處理的數碼印花噴墨墨滴形狀規范的研究(Python+OpenCV+Mysql)

大體思路&#xff1a;由于墨滴的不同參數會對墨滴的形態產生一定的影響&#xff0c;故如果通過研究墨滴的形態則通過海量的數據就可以大概確定墨滴的各項參數指標的范圍。通過OpenCV對墨滴的噴出的形狀進行圖像處理&#xff0c;對墨滴圖像進行一系列的分析&#xff0c;通過一系…

ASP.NET 主題(Themes)FAQ

1、主題是什么 主題由一組元素組成&#xff1a;外觀、級聯樣式表 (CSS)、圖像和其他資源。主題將至少包含外觀。主題是在網站或 Web 服務器上的特殊目錄中定義的。主題是一組Web Control的屬性設置的集合&#xff0c;提供一種簡單的方法設置控件的樣式屬性。 主題只在Web Contr…

Head First HTML與CSS、XHTML++筆記(第四章 WEB鎮之旅 第五章 認識媒體)

第四章 鏈接&#xff08;詳解<a>元素&#xff09; 目標錨 在目標位置 <h2><a id"chai">contentTest</a></h2> 在需要鏈接位置 <a href"index.html#chai">See</a> 鏈接到自身的目標錨 <a href"#top"…

Opencv實戰【4】——圖片動漫化處理

博主聯系方式&#xff1a; QQ:1540984562 微信&#xff1a;wxid_nz49532kbh9u22 QQ交流群&#xff1a;750313950 目錄動漫化風格的特點處理手段代碼實現效果總結動漫化風格的特點 &#xff08;1&#xff09;動漫中的細節相對少&#xff1b; &#xff08;2&#xff09;動漫中的邊…

nextshort_Java掃描儀的nextShort()方法與示例

nextshort掃描器類的nextShort()方法 (Scanner Class nextShort() method) Syntax: 句法&#xff1a; public short nextShort();public short nextShort(int rad);nextShort() method is available in java.util package. nextShort()方法在java.util包中可用。 nextShort() …

php 生成css文件怎么打開,php生成html文件的多種步驟介紹

//定義日期函數functiongetdatetime(){$datetimegetdate();$strReturn$datetime["year"]."-";$strReturn$strReturn.$datetime["mon"]."-";$strReturn$strReturn.$datetime["mday"];return$strReturn;}//定義時間函數(文件名…

08-KNN手寫數字識別

標簽下載地址 文件內容備注train-images-idx3-ubyte.gz訓練集圖片&#xff1a;55000張訓練圖片&#xff0c;5000張驗證圖片train-labels-idx1-ubyte.gz訓練集圖片對應的數字標簽t10k-images-idx3-ubyte.gz測試集圖片&#xff1a;10000張圖片t表示test&#xff0c;測試圖片&…

MFC odbc訪問遠程數據庫

首先&#xff0c;MFC通過ODBC訪問數據庫&#xff0c;主要使用兩個類&#xff0c;一個是CDataBase&#xff0c;一個是CRecordset。第一個是用于建立數據庫連接的&#xff0c;第二個是數據集&#xff0c;用來查詢的。步驟如下&#xff1a;1.實例化一個CDataBase對象&#xff0c;并…

微機原理——擴展存儲器設計

目錄【1】存儲器的層次結構【2】存儲器的分類【3】SRAM1、基本原理&#xff1a;2、結構&#xff1a;3、芯片參數與引腳解讀&#xff1a;4、CPU與SRAM的連接方式【4】DRAM1、基本原理&#xff1a;2、結構3、芯片引腳解讀&#xff1a;【5】存儲器系統設計【6】存儲器擴展設計&…

floatvalue 重寫_Java Number floatValue()方法與示例

floatvalue 重寫Number類floatValue()方法 (Number Class floatValue() method) floatValue() method is available in java.lang package. floatValue()方法在java.lang包中可用。 floatValue() method is used to return the value denoted by this Number object converted …

array_column php什么版本可以用,array_column兼容php5.5以下版本

gistfile1.txt// ----------------------------------------------------------------------// |獲取二維數組中指定的一列&#xff0c;PHP5.5以后有專用函數array_column()// ----------------------------------------------------------------------// |param array $arr// …

。net學習之控件的使用注意點

jQuery使用 1、自定義屬性的使用<script>$(#xwjj_i_main br[brinfoPd_KangQiao_Subject_Xwjj_br_1]).hide();</script> 2、ready代碼塊$(document).ready(function(){ //你的代碼}); 3、簡單的特效hide&#xff08;&#xff09;$("a").click(function()…

09-CNN手寫數字識別

CNN卷積神經網絡的本質就是卷積運算 維度的調整&#xff1a; tf.reshape(imageInput,[-1,28,28,1]) imageInput為[None,784]&#xff0c;N行* 784維 調整為 M28行28列*1通道 即&#xff1a;二維轉化為四維數據 參數一&#xff1a;等價于運算結果M 參數二&#xff1a;28 28 表示…