本文目錄一覽:
用opencv去噪
使用opencv-python的內置函數,對圖片進行降噪處理。
8Fourier變換的應用——圖像去噪
給出的圖片是RGB圖片,也就是需要有三個通道。
下面的函數用來去噪。
img=np.uint8(cv2.fastNlMeansDenoisingColored(img,None,10,10,7,21))
對這個圖片進行局部自適應二值化處理:
img=hui(img)
th1 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_MEAN_C,cv2.THRESH_BINARY,31,5)
另一種局部自適應二值化處理:
th2 = cv2.adaptiveThreshold(img,255,cv2.ADAPTIVE_THRESH_GAUSSIAN_C,cv2.THRESH_BINARY,31,5)
在第一步連續執行兩次去噪,得到的三幅圖片是:
執行三次降噪。
連續10次降噪。
3種python3的canny邊緣檢測之靜態,可調節和自適應
先看高級版的python3的canny的自適應邊緣檢測:
內容:
1 canny的邊緣檢測的介紹。
2 三種方法的canny的邊緣檢測,由淺入深地介紹:固定值的靜態,可自調節的,自適應的。
說明:
1 環境:python3.8、opencv4.5.3和matplotlib3.4.3。
2 圖片:來自品閱網正版免費圖庫。
3 實現自適應閾值的canny邊緣檢測的參考代碼和文章:
上述的代碼,本機均有報錯,故對代碼進行修改,注釋和運行。
初級canny:
1 介紹:opencv中給出了canny邊緣檢測的介面,直接調用:
即可得到邊緣檢測的結果ret,其中,t1,t2是需要人為設置的閾值。
2 python的opencv的一行代碼即可實現邊緣檢測。
3 Canny函數及使用:
4 Canny邊緣檢測流程:
去噪 — 梯度 — 非極大值抑制 — 滯後閾值
5 代碼:
6 操作和過程:
7 原圖:
8 疑問:
ret = cv2.canny(img,t1,t2),其中,t1,t2是需要人為設置的閾值,一般人怎麼知道具體數值是多少,才是最佳的呀?所以,這是它的缺點。
中級canny:
1 中級canny,就是可調節的閾值,找到最佳的canny邊緣檢測效果。
2 採用cv2.createTrackbar來調節閾值。
3 代碼:
4 操作和效果:
5 原圖:
高級canny:
1 自適應canny的演算法:
ret = cv2.canny(img,t1,t2)
即演算法在運行過程中能夠自適應地找到較佳的分割閾值t1,t2。
2 文件結構:
3 main.py代碼:
4 dog.py代碼:
5 bilateralfilt.py代碼:
6 原圖:
7 效果圖:本文第一個gif圖,此處省略。
小結:
1 本文由淺入深,總結的很好,適合收藏。
2 對於理解python的opencv的canny的邊緣檢測,很有幫助。
3 本文高級版canny自適應的演算法參考2篇文章,雖然我進行代碼的刪除,注釋,修改,優化等操作,故我不標註原創,對原作者表達敬意。
4 自己總結和整理,分享出來,希望對大家有幫助。
怎樣用python實現圖像去噪
#coding:utf-8
import sys,os
from PIL import Image,ImageDraw
#二值數組
t2val = {}
def twoValue(image,G):
for y in xrange(0,image.size[1]):
for x in xrange(0,image.size[0]):
g = image.getpixel((x,y))
if g G:
t2val[(x,y)] = 1
else:
t2val[(x,y)] = 0
# 降噪
# 根據一個點A的RGB值,與周圍的8個點的RBG值比較,設定一個值N(0 N 8),當A的RGB值與周圍8個點的RGB相等數小於N時,此點為噪點
# G: Integer 圖像二值化閥值
# N: Integer 降噪率 0 N 8
# Z: Integer 降噪次數
# 輸出
# 0:降噪成功
# 1:降噪失敗
def clearNoise(image,N,Z):
for i in xrange(0,Z):
t2val[(0,0)] = 1
t2val[(image.size[0] – 1,image.size[1] – 1)] = 1
for x in xrange(1,image.size[0] – 1):
for y in xrange(1,image.size[1] – 1):
nearDots = 0
L = t2val[(x,y)]
if L == t2val[(x – 1,y – 1)]:
nearDots += 1
if L == t2val[(x – 1,y)]:
nearDots += 1
if L == t2val[(x- 1,y + 1)]:
nearDots += 1
if L == t2val[(x,y – 1)]:
nearDots += 1
if L == t2val[(x,y + 1)]:
nearDots += 1
if L == t2val[(x + 1,y – 1)]:
nearDots += 1
if L == t2val[(x + 1,y)]:
nearDots += 1
if L == t2val[(x + 1,y + 1)]:
nearDots += 1
if nearDots N:
t2val[(x,y)] = 1
def saveImage(filename,size):
image = Image.new(“1”,size)
draw = ImageDraw.Draw(image)
for x in xrange(0,size[0]):
for y in xrange(0,size[1]):
draw.point((x,y),t2val[(x,y)])
image.save(filename)
image = Image.open(“d:/1.jpg”).convert(“L”)
twoValue(image,100)
clearNoise(image,4,1)
saveImage(“d:/5.jpg”,image.size)
python圖像處理代碼,望大神詳細解釋。越詳細越好
#初始化一個矩形np.max(marks)+1行,3列,默認值為0
colorTab = np.zeros((np.max(marks)+1,3))
#遍曆數組,給每行的3列賦值,就是RGB顏色值,8位的
for i in range(len(colorTab)):
aa = np.random.uniform(0,255)
bb = np.random.uniform(0,255)
cc = np.random.uniform(0,255)
colorTab[i] = np.array([aa,bb,cc],np.uint8)
#初始化另一個跟img圖像形狀大小一樣的圖像,一副黑色圖像
bgrImage = np.zeros(img.shape,np.uint8)
#遍歷marks形狀的行列
for i in range(marks.shape[0]):
for j in range(marks.shape[1]):
index = marks[i][j]
#判斷是不是區域與區域之間的分界,如果是邊界(-1),則使用白色顯示
if index == -1:
bgrImage[i][j] = np.array([255,255,255]) #像素點設置位白色
else:
bgrImage[i][j] = colorTab[index] #像素點設置位上邊隨機生成的顏色值
#顯示處理後的圖像圖像
cv2.imshow(‘After ColorFill’,bgrImage)
#總結,先生成一個跟marks相同數量的row*col的一張顏色表,然後創建一個跟marks相同大小的一副黑色圖像
#最後對黑色圖像畫出白色邊界和內部隨機彩色像素值
中值濾波
一. 中值濾波:
中值濾波器是一種可以使圖像平滑的濾波器。它使用濾波器範圍內的像素的中值去代表該範圍內所有的像素。中值濾波是消除圖像雜訊最常見的手段之一,特別是消除椒鹽雜訊,中值濾波的效果要比均值濾波更好。
二. python實現中值濾波和均值濾波,並用兩種濾波器對受到椒鹽雜訊污染的圖像進行去噪
import cv2
import numpy as np
# Median filter
def median_filter(img, K_size=3):
H, W, C = img.shape
## Zero padding
pad = K_size // 2
out = np.zeros((H + pad*2, W + pad*2, C), dtype=np.float)
out[pad:pad+H, pad:pad+W] = img.copy().astype(np.float)
tmp = out.copy()
# filtering
for y in range(H):
for x in range(W):
for c in range(C):
out[pad+y, pad+x, c] = np.median(tmp[y:y+K_size, x:x+K_size, c])
out = out[pad:pad+H, pad:pad+W].astype(np.uint8)
return out
# Average filter
def average_filter(img, G=3):
out = img.copy()
H, W, C = img.shape
Nh = int(H / G)
Nw = int(W / G)
for y in range(Nh):
for x in range(Nw):
for c in range(C):
out[G*y:G*(y+1), G*x:G*(x+1), c] = np.mean(out[G*y:G*(y+1), G*x:G*(x+1), c]).astype(np.int)
return out
# Read image
img = cv2.imread(“../paojie_sp.jpg”)
# Median Filter and Average Filter
out1 = median_filter(img, K_size=3)
out2 = average_filter(img,G=3)
# Save result
cv2.imwrite(“out1.jpg”, out1)
cv2.imwrite(“out2.jpg”, out2)
cv2.waitKey(0)
cv2.destroyAllWindows()
三. 實驗結果
可以明顯看出,對於受到椒鹽雜訊污染的圖像,中值濾波往往比均值濾波的去噪效果要好!
四. 參考內容:
原創文章,作者:ESSLH,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317891.html