[python opencv 計算機視覺零基礎到實戰] 十、圖片效果毛玻璃

一、學習目標

  1. 了解高斯模糊的使用方法
  2. 了解毛玻璃的圖片效果添加
  3. 了解如何自己做一個噪聲圖片

上一篇:[python opencv 計算機視覺零基礎到實戰] 九、模糊

如有錯誤歡迎指出~

二、了解模糊與美顏

2.1 使用高斯模糊降噪

由于很多小伙伴反應拋開原理或理論講解使用用法對于初學者來說會很舒服,從本節開始將會以比較簡單的方式進行講解相關API的應用。

首先我們有一張圖:

這張圖存在很多的噪點,那如何對改圖片進行降噪呢?學過前幾節的同學可能對降噪還是挺了解的。可能有些同學會說均值模糊和中值模糊。那我們先試試中值模糊:
首先獲取圖片:

import cv2img = cv2.imread(r'C:\Users\mx\Desktop\111.png')
dst=cv2.medianBlur(img,5)

隨后進行中值模糊,并等待:

cv2.imshow("img", dst)
cv2.waitKey (0)
cv2.destroyAllWindows()

結果如下:

從結果中可以得知,確實降噪的效果不錯,但是有一定的糊。現在我們再試試均值模糊。把中值模糊代碼改為:

dst=cv2.blur(img,(2,24))

結果如下:

感覺更糊了,現在我們用我們高斯模糊試試水。高斯模糊使用API GaussianBlur,高斯模糊使用加權平均法對該半徑、范圍進行模糊。
GaussianBlur方法原型如下:

cv2.GaussianBlur( SRC,ksize,sigmaX )

我們在當前代碼中使用中可以按如下參數傳遞:

dst=cv2.GaussianBlur(img,(5,5),0)	

其中img是要進行模糊的圖像,(5,5)是高斯核的大小,一般核大小都是奇數,最后一個為標準差,我們直接取0即可。
若我(5,5)寫成(1,1)則表示不對原始圖像做操作。核越大圖像的模糊程度越大。適當取合適值可以使圖片模糊度不至于過糊。如果需要進行過濾圖像的大小相等時,那么一般(5,5)的兩個值都是一樣,其實可以看做一個比例大小。我們添加原圖顯示與高斯模糊后的效果進行對比,完整代碼如下:

import cv2img = cv2.imread(r'C:\Users\mx\Desktop\111.png')
dst=cv2.GaussianBlur(img,(5,5),0)		
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.imshow("Image", img)
cv2.imshow("Gaussian", dst)
cv2.waitKey (0)
cv2.destroyAllWindows()

結果如下:


從圖片上來看高斯模糊對于整個輪廓的改變效果還是挺小的。其實高斯模糊對于我們來說應該是挺熟悉的,高斯模糊在一些圖片處理軟件上會用來對圖片增加毛玻璃效果。這時我們只需要將核大小置零,隨后更改方差值,這是就會出現毛玻璃效果。代碼如下:

dst=cv2.GaussianBlur(img,(0,0),20)	

2.2 自己編寫噪點圖片

其實2.1中的噪點圖片是我自己編輯而成,那自己如何編寫類似的噪點圖片呢?很簡單只需要遍歷圖片大小即可。遍歷圖片大小對像素點進行隨機值的增加。如何遍歷圖片?只需要獲取圖片的寬高,對圖片進行遍歷即可。
首先我們讀取圖片后對圖片進行寬高獲取:

import cv2img = cv2.imread(r'C:\Users\mx\Desktop\111.png')
h,w,c=img.shape

隨后遍歷每個像素點:

for row in range(h):for col in range(w):b=img[row,col,0]g=img[row,col,1]r=img[row,col,2]

以上外層循環中遍歷高元素,隨后內層循環遍歷每個高元素的寬度元素;在寬度元素中獲取3個通道的值。有些小伙伴可能會說,為什么獲取3個通道的值不使用循環?那是因為若使用循環會導致復雜度增加,會讓程序運行的更慢,所以為了減少復雜度,在這里我使用了較為“笨”的方法直接讀取3個通道的值。
隨后隨意生成一個3位隨機數,對該圖片的像素點進行增加:

srand=np.random.normal(0,30,3)
img[row,col,0]=b+srand[0]
img[row,col,1]=g+srand[1]
img[row,col,2]=r+srand[2]

結果如下:咦?那為什么變成這個樣子了?先別急,我們直接使用高斯模糊進行降噪吧:

dst=cv2.GaussianBlur(img,(5,5),0)

結果如下:

咦?感覺降噪效果還不錯,這個時候我們就應該明白,“高斯模糊使用加權平均法對該半徑、范圍進行模糊”,我們可以很清楚的從結果圖中看見噪聲在該色值周圍得到了一定的“還原”。

好了,我們現在來探究為什么這個圖編輯了隨機值后有的會白白的。那是因為我們沒有做“溢出”計算;我們在計算值的增減時應該考慮該值是否超過了255又或者是否小于了0,若小于0則置0,若大于255則等于255。因為如果我們加上一個值,小于0,那么表示這個值本省偏暗,直接置0所偏向并沒有改變;若大于255則表示偏亮,直接等于255不會改變顏色的偏向,所以這樣做是沒問題的,極大限度的保留了原圖的基本樣貌。那么此時的代碼的完整代碼如下:

import cv2
import numpy as npimg = cv2.imread(r'C:\Users\mx\Desktop\111.png')
h,w,c=img.shapefor row in range(h):for col in range(w):srand=np.random.normal(0,30,3)b=img[row,col,0]g=img[row,col,1]r=img[row,col,2]if b+srand[0]>255:img[row,col,0]=255elif b+srand[0]<0:img[row,col,0]=0else:img[row,col,0]=b+srand[0]if g+srand[1]>255:img[row,col,1]=255elif g+srand[1]<0:img[row,col,1]=0else:img[row,col,1]=g+srand[1]if r+srand[2]>255:img[row,col,2]=255elif r+srand[2]<0:img[row,col,2]=0else:img[row,col,2]=r+srand[2]
#dst=cv2.blur(img,(2,24))
dst=cv2.GaussianBlur(img,(0,0),20)		
cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
cv2.imshow("Image", img)
cv2.imshow("Gaussian", dst)
cv2.waitKey (0)
cv2.destroyAllWindows()

結果如下:

該系列文章首發于ebaina

三、總結

  1. 了解了制作噪聲圖片的注意事項,偏亮偏暗值需要等值賦予
  2. 了解高斯模糊的使用方法及保留輪廓的特性

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

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

相關文章

Android之自定義View實現帶4圓角或者2圓角的效果

1 問題 實現任意view經過自定義帶4圓角或者2圓角的效果 2 原理 1) 實現view 4圓角 我們只需要把左邊的圖嵌入到右邊里面去,最終顯示左邊的圖就行。 2) 實現view上2圓角 我們只需要把左邊的圖嵌入到右邊里面去,最終顯示左邊的圖就行。 安卓源碼里面有這樣的類 package and…

java trim()函數_Java - split()函數和trim()函數的使用方法

split()函數和trim()函數的使用方法本文地址: http://blog.csdn.net/caroline_wendy/article/details/24465141詳細參考Java API: http://docs.oracle.com/javase/6/docs/api/java/lang/String.htmlsplit()函數是依據參數如",", "-", " "等, 切割…

分布式服務器集群架構方案思考

0x01.大型網站演化 簡單說&#xff0c;分布式是以縮短單個任務的執行時間來提升效率的&#xff0c;而集群則是通過提高單位時間內執行的任務數來提升效率。 集群主要分為&#xff1a;高可用集群(High Availability Cluster)&#xff0c;負載均衡集群(Load Balance Cluster&…

交互式 .Net 容器版

1背景介紹 在之前的文章 - 交互式 .Net 中已經介紹了什么是 交互式 .Net&#xff0c;文中是通過 Visual Studio Code 插件的方式實現 交互式 .Net 的。現在&#xff0c;我們將使用容器的方式實現 交互式 .Net。2鏡像構建 1. DockerfileFROM mcr.microsoft.com/dotn…

Java 集合練習——3

創建Map集合&#xff0c;創建Emp對象&#xff0c;并將創建的Emp對象添加到集合中&#xff0c;并將id為005的對象從集合中移除 創建Emp類&#xff1a; package jihe;public class Emp {private String id;public String getId() {return id;}public void setId(String id) {this…

[python opencv 計算機視覺零基礎到實戰] 十一找到圖片中指定內容

一、學習目標 了解圖片內容定位方法matchTemplate使用了解minMaxLoc方法使用 上一篇《[python opencv 計算機視覺零基礎到實戰] 十、圖片效果毛玻璃》 如有錯誤歡迎指出~ 二、了解從一張圖片中找到指定內容的方法 2.1 使用matchTemplate函數對圖片中的指定內容進行查找 有…

Linq 實現 DataTable 行轉列

前幾天寫了一篇sqlserver 行轉列&#xff0c;http://www.cnblogs.com/li-peng/archive/2012/02/01/2334973.html 由于工作需要&#xff0c;要把查出來的DataTable實現 行轉列&#xff0c; 正好這一陣子在用Linq 就做了一個行轉列的小例 子 轉換前的table: 轉換后的table: 代碼…

Android Studio之編譯提示\app\src\main\res\values\colors.xml:1:1 Error:前言有不允許的內容

1 問題 Android Studio新建立的項目運行莫名其妙提示錯誤如下 app\src\main\res\values\colors.xml:1:1 Error:前言有不允許的內容 然后我把res目錄下面的colors.xml文件打開看如下 <?xml version"1.0" encoding"utf-8"?> <resources>&l…

python順序執行 toggle_編寫腳本在Python中運行多個腳本

我正在建一個鬧鐘項目。誰能告訴我如何編寫一個腳本來調用所有其他腳本嗎。例如&#xff0c;我在我的樹莓派上有三個腳本叫做LCDTESTFORPI.py&#xff0c;另一個叫做“ex 7”分段.py“還有一個叫”報警pi.py”. 我希望能夠運行一個名為“alarmpi”的腳本_初始py“它將運行所有其…

AndroidService 深度分析(2)

AndroidService 深度分析&#xff08;2&#xff09; 上一篇文章我們Service的生命周期進行了測試及總結。這篇文章我們介紹下綁定執行的Service的實現。 綁定執行的Service可能是僅為本應用提供服務&#xff0c;稱為本地Service。也可能為其它應用提供跨進程服務&#xff0c;即…

Hello Playwright:(3)基本概念

下面介紹一下 Playwright 中的基本概念&#xff1a;Headless 瀏覽器Playwright 需要特定版本的瀏覽器二進制文件才能運行。這些瀏覽器都支持 2 種 運行模式&#xff1a;Headless&#xff0c;無瀏覽器 UI&#xff0c;運行速度較快&#xff0c;常用于自動化運行Headed&#xff0c…

[python opencv 計算機視覺零基礎到實戰] 十二 直方圖

一、學習目標 了解matplotlib繪圖庫的使用了解如何通過折線圖或者直方圖對圖表進行繪制了解了通過圖標對圖片內容進行直觀判斷 如有錯誤歡迎指出~ 二、了解圖像直方圖及其應用 2.1 了解matplotlib庫 在了解圖像直方圖前我們需要了解一個matplotlib庫&#xff0c;matplotli…

建造者模式之項目運用

1 問題 建造者模式&#xff0c;我們也許不陌生&#xff0c;因為我們看到很多開源框架或者Android源碼里面用到&#xff0c;類似這樣的代碼結構 A a new A.builder().method1("111").method2("222").build(); 很明顯&#xff0c;一般這里的結構有builde…

專題三--1005

題目 A group of researchers are designing an experiment to test the IQ of a monkey. They will hang a banana at the roof of a building, and at the mean time, provide the monkey with some blocks. If the monkey is clever enough, it shall be able to reach the …

shell中的數字

shell中的數字 author :headsen chen date :2017-10-18 15:01:42 個人原創&#xff0c;轉載請注明作者&#xff0c;出處&#xff0c;否則依法追究法律責任 1,生成隨機數&#xff08;范圍&#xff1a;0-32767&#xff09;&#xff0c;用特殊變量&#xff1a;RANDOM 2&#xff…

serviceloader java_【java編程】ServiceLoader使用看這一篇就夠了

轉載:https://www.jianshu.com/p/7601ba434ff4想必大家多多少少聽過spi&#xff0c;具體的解釋我就不多說了。但是它具體是怎么實現的呢&#xff1f;它的原理是什么呢&#xff1f;下面我就圍繞這兩個問題來解釋&#xff1a;實現: 其實具體的實現類就是java.util.ServiceLoader…

.NET7 Preview4 之OpenAPI swagger改進

在MiniAPI系列中&#xff0c;《.NET6之MiniAPI(十八)&#xff1a;OpenAPI swagger》介紹了swagger在MiniAPI框架中的使用&#xff0c;當時留下很多不足&#xff0c;隨著.NET7 Preview4的推出&#xff0c;這方面得到了很大的改進&#xff0c;我還是使用“十八”這篇文章的案例。…

Swift - 自定義單元格實現微信聊天界面

1&#xff0c;下面是一個放微信聊天界面的消息展示列表&#xff0c;實現的功能有&#xff1a; &#xff08;1&#xff09;消息可以是文本消息也可以是圖片消息&#xff08;2&#xff09;消息背景為氣泡狀圖片&#xff0c;同時消息氣泡可根據內容自適應大小&#xff08;3&#x…