編輯:感謝霍華德,我在這裏糾正代碼,它似乎是現在的工作。這個python圖像模糊函數有什麼問題?
EDIT2:我已經更新了代碼以包含垂直模糊。使用不同的設置產生的樣本輸出:Blur comparison images.jpg
的模糊操作的另一個參考(JAVA):Blurring for Beginners
原帖:
我想了解基本的圖像處理和重複這個簡單Blur method在python(在「重用結果」第二功能BlurHorizontal)。我知道PIL中已經有模糊函數,但我想自己嘗試基本的像素操作。
該函數應該獲取源圖像,然後基於某個半徑平均RGB像素值並將處理後的圖像寫入新文件。我的問題是,我得到了很多的像素與完全錯誤的平均值(例如,亮綠色的線,而不是紅色在某些領域)。
模糊半徑爲2時,平均方法將以輸入像素爲中心的5個像素的RGB值相加。它使用「滑動窗口」,以保持一個運行總計,減去傳出像素(左側)以及將所述新的輸入像素(窗口的右側)。 Blur method explained here
在那裏我已經出了錯任何想法?我不知道爲什麼圖像的某些部分乾淨模糊而其他地區都充滿了色彩完全無關的周邊地區。
感謝您的幫助。
固定的工作守則(感謝霍華德)
import Image, numpy, ImageFilter
img = Image.open('testimage.jpg')
imgArr = numpy.asarray(img) # readonly
# blur radius in pixels
radius = 2
# blur window length in pixels
windowLen = radius*2+1
# columns (x) image width in pixels
imgWidth = imgArr.shape[1]
# rows (y) image height in pixels
imgHeight = imgArr.shape[0]
#simple box/window blur
def doblur(imgArr):
# create array for processed image based on input image dimensions
imgB = numpy.zeros((imgHeight,imgWidth,3),numpy.uint8)
imgC = numpy.zeros((imgHeight,imgWidth,3),numpy.uint8)
# blur horizontal row by row
for ro in range(imgHeight):
# RGB color values
totalR = 0
totalG = 0
totalB = 0
# calculate blurred value of first pixel in each row
for rads in range(-radius, radius+1):
if (rads) >= 0 and (rads) <= imgWidth-1:
totalR += imgArr[ro,rads][0]/windowLen
totalG += imgArr[ro,rads][1]/windowLen
totalB += imgArr[ro,rads][2]/windowLen
imgB[ro,0] = [totalR,totalG,totalB]
# calculate blurred value of the rest of the row based on
# unweighted average of surrounding pixels within blur radius
# using sliding window totals (add incoming, subtract outgoing pixels)
for co in range(1,imgWidth):
if (co-radius-1) >= 0:
totalR -= imgArr[ro,co-radius-1][0]/windowLen
totalG -= imgArr[ro,co-radius-1][1]/windowLen
totalB -= imgArr[ro,co-radius-1][2]/windowLen
if (co+radius) <= imgWidth-1:
totalR += imgArr[ro,co+radius][0]/windowLen
totalG += imgArr[ro,co+radius][1]/windowLen
totalB += imgArr[ro,co+radius][2]/windowLen
# put average color value into imgB pixel
imgB[ro,co] = [totalR,totalG,totalB]
# blur vertical
for co in range(imgWidth):
totalR = 0
totalG = 0
totalB = 0
for rads in range(-radius, radius+1):
if (rads) >= 0 and (rads) <= imgHeight-1:
totalR += imgB[rads,co][0]/windowLen
totalG += imgB[rads,co][1]/windowLen
totalB += imgB[rads,co][2]/windowLen
imgC[0,co] = [totalR,totalG,totalB]
for ro in range(1,imgHeight):
if (ro-radius-1) >= 0:
totalR -= imgB[ro-radius-1,co][0]/windowLen
totalG -= imgB[ro-radius-1,co][1]/windowLen
totalB -= imgB[ro-radius-1,co][2]/windowLen
if (ro+radius) <= imgHeight-1:
totalR += imgB[ro+radius,co][0]/windowLen
totalG += imgB[ro+radius,co][1]/windowLen
totalB += imgB[ro+radius,co][2]/windowLen
imgC[ro,co] = [totalR,totalG,totalB]
return imgC
# number of times to run blur operation
blurPasses = 3
# temporary image array for multiple passes
imgTmp = imgArr
for k in range(blurPasses):
imgTmp = doblur(imgTmp)
print "pass #",k,"done."
imgOut = Image.fromarray(numpy.uint8(imgTmp))
imgOut.save('testimage-processed.png', 'PNG')
你可以張貼一些樣品輸入/輸出? – Blender 2011-04-03 05:46:21
當我看到'a-b-c'時,我總是很擔心。我從來沒有記得任何語言的運算符的關聯性,以便知道它是否會被解釋爲'a-(bc)'或'(ab)-c' – sarnold 2011-04-03 06:05:33
在我使用的每種語言中,加法,減法,乘法,和師從左到右,如數學。冪指數是唯一經常將右向左聯繫起來的常見現象。 – 2011-04-03 06:08:49