±à¼ÍƼö: |
±¾ÎÄÀ´×Ôcsdn£¬±¾Õ½²½â²Ù×÷ºÍ´¦ÀíͼÏñµÄ»ù´¡ÖªÊ¶£¬½«Í¨¹ý´óÁ¿Ê¾Àý½éÉÜ´¦ÀíͼÏñËùÐèµÄ
Python ¹¤¾ß°ü£¬²¢½éÉÜÓÃÓÚ¶ÁȡͼÏñ¡¢Í¼Ïñת»»ºÍËõ·Å¡¢¼ÆËãµ¼Êý¡¢»Í¼ºÍ±£´æ½á¹ûµÈµÄ»ù±¾¹¤¾ß¡£ÕâЩ¹¤¾ßµÄʹÓý«¹á´©±¾ÊéµÄÊ£ÓàÕ½ڡ£
|
|
µÚ 1 Õ¡¡»ù±¾µÄͼÏñ²Ù×÷ºÍ´¦Àí
1.1¡¡PIL£ºPythonͼÏñ´¦ÀíÀà¿â
PIL£¨Python Imaging Library Python£¬Í¼Ïñ´¦ÀíÀà¿â£©ÌṩÁËͨÓõÄͼÏñ´¦Àí¹¦ÄÜ£¬ÒÔ¼°´óÁ¿ÓÐÓõĻù±¾Í¼Ïñ²Ù×÷£¬±ÈÈçͼÏñËõ·Å¡¢²Ã¼ô¡¢Ðýת¡¢ÑÕɫת»»µÈ¡£PIL
ÊÇÃâ·ÑµÄ£¬¿ÉÒÔ´Ó ÏÂÔØ¡£
ÀûÓà PIL Öеĺ¯Êý£¬ÎÒÃÇ¿ÉÒÔ´Ó´ó¶àÊýͼÏñ¸ñʽµÄÎļþÖжÁÈ¡Êý¾Ý£¬È»ºóдÈë×î³£¼ûµÄͼÏñ¸ñʽÎļþÖС£PIL
ÖÐ×îÖØÒªµÄÄ£¿éΪ Image¡£Òª¶Áȡһ·ùͼÏñ£¬¿ÉÒÔʹÓãº
from PIL import
Image
pil_im = Image.open('empire.jpg') |
ÉÏÊö´úÂëµÄ·µ»ØÖµ pil_im ÊÇÒ»¸ö PIL ͼÏñ¶ÔÏó¡£
ͼÏñµÄÑÕɫת»»¿ÉÒÔʹÓà convert() ·½·¨À´ÊµÏÖ¡£Òª¶Áȡһ·ùͼÏñ£¬²¢½«Æäת»»³É»Ò¶ÈͼÏñ£¬Ö»ÐèÒª¼ÓÉÏ
convert('L')£¬ÈçÏÂËùʾ£º
pil_im = Image.open('empire.jpg').convert('L') |
ÔÚ PIL ÎĵµÖÐÓÐһЩÀý×Ó£¬²Î¼û ¡£ÕâЩÀý×ÓµÄÊä³ö½á¹ûÈçͼ 1-1
Ëùʾ¡£

ͼ 1-1£ºÓà PIL ´¦ÀíͼÏñµÄÀý×Ó
1.1.1¡¡×ª»»Í¼Ïñ¸ñʽ
ͨ¹ý save() ·½·¨£¬PIL ¿ÉÒÔ½«Í¼Ïñ±£´æ³É¶àÖÖ¸ñʽµÄÎļþ¡£ÏÂÃæµÄÀý×Ó´ÓÎļþÃûÁÐ±í£¨filelist£©ÖжÁÈ¡ËùÓеÄͼÏñÎļþ£¬²¢×ª»»³É
JPEG ¸ñʽ£º
from PIL import
Image
import os
for infile in filelist:
outfile = os.path.splitext(infile)[0] + ".jpg"
if infile != outfile:
try:
Image.open(infile).save(outfile)
except IOError:
print "cannot convert", infile |
PIL µÄ open() º¯ÊýÓÃÓÚ´´½¨ PIL ͼÏñ¶ÔÏó£¬save() ·½·¨ÓÃÓÚ±£´æÍ¼Ïñµ½¾ßÓÐÖ¸¶¨ÎļþÃûµÄÎļþ¡£³ýÁ˺ó׺±äΪ¡°.jpg¡±£¬ÉÏÊö´úÂëµÄÐÂÎļþÃûºÍÔÎļþÃûÏàͬ¡£PIL
ÊǸö×ã¹»ÖÇÄܵÄÀà¿â£¬¿ÉÒÔ¸ù¾ÝÎļþÀ©Õ¹ÃûÀ´Åж¨Í¼ÏñµÄ¸ñʽ¡£PIL º¯Êý»á½øÐмòµ¥µÄ¼ì²é£¬Èç¹ûÎļþ²»ÊÇ
JPEG ¸ñʽ£¬»á×Ô¶¯½«Æäת»»³É JPEG ¸ñʽ£»Èç¹ûת»»Ê§°Ü£¬Ëü»áÔÚ¿ØÖÆÌ¨Êä³öÒ»Ìõ±¨¸æÊ§°ÜµÄÏûÏ¢¡£
±¾Êé»á´¦Àí´óÁ¿Í¼ÏñÁÐ±í¡£ÏÂÃæ½«´´½¨Ò»¸ö°üº¬Îļþ¼ÐÖÐËùÓÐͼÏñÎļþµÄÎļþÃûÁÐ±í¡£Ê×ÏÈн¨Ò»¸öÎļþ£¬ÃüÃûΪ
imtools.py£¬À´´æ´¢Ò»Ð©¾³£Ê¹ÓõÄͼÏñ²Ù×÷£¬È»ºó½«ÏÂÃæµÄº¯ÊýÌí¼Ó½øÈ¥£º
import os
def get_imlist(path):
""" ·µ»ØÄ¿Â¼ÖÐËùÓÐJPG ͼÏñµÄÎļþÃûÁбí"""
return [os.path.join(path,f) for f in os.listdir(path)
if f.endswith('.jpg')] |
ÏÖÔÚ£¬»Øµ½ PIL¡£
1.1.2¡¡´´½¨ËõÂÔͼ
ʹÓà PIL ¿ÉÒԺܷ½±ãµØ´´½¨Í¼ÏñµÄËõÂÔͼ¡£thumbnail()
·½·¨½ÓÊÜÒ»¸öÔª×é²ÎÊý£¨¸Ã²ÎÊýÖ¸¶¨Éú³ÉËõÂÔͼµÄ´óС£©£¬È»ºó½«Í¼Ïñת»»³É·ûºÏÔª×é²ÎÊýÖ¸¶¨´óСµÄËõÂÔͼ¡£ÀýÈ磬´´½¨×±ßΪ
128 ÏñËØµÄËõÂÔͼ£¬¿ÉÒÔʹÓÃÏÂÁÐÃüÁ
pil_im.thumbnail((128,128)) |
1.1.3¡¡¸´ÖƺÍÕ³ÌùͼÏñÇøÓò
ʹÓà crop() ·½·¨¿ÉÒÔ´ÓÒ»·ùͼÏñÖвüôÖ¸¶¨ÇøÓò£º
box = (100,100,400,400)
region = pil_im.crop(box) |
¸ÃÇøÓòʹÓÃËÄÔª×éÀ´Ö¸¶¨¡£ËÄÔª×éµÄ×ø±êÒÀ´ÎÊÇ£¨×ó£¬ÉÏ£¬ÓÒ£¬Ï£©¡£PIL
ÖÐÖ¸¶¨×ø±êϵµÄ×óÉϽÇ×ø±êΪ£¨0£¬0£©¡£ÎÒÃÇ¿ÉÒÔÐýתÉÏÃæ´úÂëÖлñÈ¡µÄÇøÓò£¬È»ºóʹÓà paste() ·½·¨½«¸ÃÇøÓò·Å»ØÈ¥£¬¾ßÌåʵÏÖÈçÏ£º
region = region.transpose(Image.ROTATE_180)
pil_im.paste(region,box) |
1.1.4¡¡µ÷Õû³ß´çºÍÐýת
Òªµ÷ÕûÒ»·ùͼÏñµÄ³ß´ç£¬ÎÒÃÇ¿ÉÒÔµ÷Óà resize() ·½·¨¡£¸Ã·½·¨µÄ²ÎÊýÊÇÒ»¸öÔª×飬ÓÃÀ´Ö¸¶¨ÐÂͼÏñµÄ´óС£º
out = pil_im.resize((128,128)) |
ÒªÐýתһ·ùͼÏñ£¬¿ÉÒÔʹÓÃÄæÊ±Õ뷽ʽ±íʾÐýת½Ç¶È£¬È»ºóµ÷Óà rotate()
·½·¨£º
ÉÏÊöÀý×ÓµÄÊä³ö½á¹ûÈçͼ 1-1 Ëùʾ¡£×î×ó¶ËÊÇÔʼͼÏñ£¬È»ºóÊǻҶÈͼÏñ¡¢Õ³ÌùÓÐÐýתºó²Ã¼ôͼÏñµÄÔʼͼÏñ£¬×îºóÊÇËõÂÔͼ¡£
1.2¡¡Matplotlib
ÎÒÃÇ´¦ÀíÊýѧÔËËã¡¢»æÖÆÍ¼±í£¬»òÕßÔÚͼÏñÉÏ»æÖƵ㡢ֱÏߺÍÇúÏßʱ£¬Matplotlib
ÊǸöºÜºÃµÄÀà¿â£¬¾ßÓÐ±È PIL ¸üÇ¿´óµÄ»æÍ¼¹¦ÄÜ¡£Matplotlib ¿ÉÒÔ»æÖƳö¸ßÖÊÁ¿µÄͼ±í£¬¾ÍÏñ±¾ÊéÖеÄÐí¶à²åͼһÑù¡£Matplotlib
ÖÐµÄ PyLab ½Ó¿Ú°üº¬ºÜ¶à·½±ãÓû§´´½¨Í¼ÏñµÄº¯Êý¡£Matplotlib ÊÇ¿ªÔ´¹¤¾ß£¬¿ÉÒÔ´Ó Ãâ·ÑÏÂÔØ¡£¸ÃÁ´½ÓÖаüº¬·Ç³£Ï꾡µÄʹÓÃ˵Ã÷ºÍ½Ì³Ì¡£ÏÂÃæµÄÀý×ÓչʾÁ˱¾ÊéÖÐÐèҪʹÓõĴ󲿷ֺ¯Êý¡£
1.2.1¡¡»æÖÆÍ¼Ïñ¡¢µãºÍÏß
¾¡¹Ü Matplotlib ¿ÉÒÔ»æÖƳö½ÏºÃµÄÌõÐÎͼ¡¢±ý״ͼ¡¢É¢µãͼµÈ£¬µ«ÊǶÔÓÚ´ó¶àÊý¼ÆËã»úÊÓ¾õÓ¦ÓÃÀ´Ëµ£¬½ö½öÐèÒªÓõ½¼¸¸ö»æÍ¼ÃüÁî¡£×îÖØÒªµÄÊÇ£¬ÎÒÃÇÏëÓõãºÍÏßÀ´±íʾһЩÊÂÎ±ÈÈçÐËȤµã¡¢¶ÔÓ¦µãÒÔ¼°¼ì²â³öµÄÎïÌå¡£ÏÂÃæÊÇÓü¸¸öµãºÍÒ»ÌõÏß»æÖÆÍ¼ÏñµÄÀý×Ó£º
from PIL import Image
from pylab import *
# ¶ÁȡͼÏñµ½Êý×éÖÐ
im = array(Image.open('empire.jpg'))
# »æÖÆÍ¼Ïñ
imshow(im)
# һЩµã
x = [100,100,400,400]
y = [200,500,200,500]
# ʹÓúìÉ«ÐÇ×´±ê¼Ç»æÖƵã
plot(x,y,'r*')
# »æÖÆÁ¬½ÓǰÁ½¸öµãµÄÏß
plot(x[:2],y[:2])
# Ìí¼Ó±êÌ⣬ÏÔʾ»æÖƵÄͼÏñ
title('Plotting: "empire.jpg"')
show() |
ÉÏÃæµÄ´úÂëÊ×ÏÈ»æÖƳöÔʼͼÏñ£¬È»ºóÔÚ x ºÍ y ÁбíÖиø¶¨µãµÄ x ×ø±êºÍ y ×ø±êÉÏ»æÖƳöºìÉ«ÐÇ×´±ê¼Çµã£¬×îºóÔÚÁ½¸öÁбí±íʾµÄǰÁ½¸öµãÖ®¼ä»æÖÆÒ»ÌõÏ߶Σ¨Ä¬ÈÏΪÀ¶É«£©¡£¸ÃÀý×ӵĻæÖƽá¹ûÈçͼ
1-2 Ëùʾ¡£show() ÃüÁîÊ×ÏÈ´ò¿ªÍ¼ÐÎÓû§½çÃæ£¨GUI£©£¬È»ºóн¨Ò»¸öͼÏñ´°¿Ú¡£¸ÃͼÐÎÓû§½çÃæ»áÑ»·×è¶Ï½Å±¾£¬È»ºóÔÝÍ££¬Ö±µ½×îºóÒ»¸öͼÏñ´°¿Ú¹Ø±Õ¡£ÔÚÿ¸ö½Å±¾ÀÄãÖ»Äܵ÷ÓÃÒ»´Î
show() ÃüÁ¶øÇÒͨ³£ÊÇÔڽű¾µÄ½áβµ÷Óá£×¢Ò⣬ÔÚ PyLab ¿âÖУ¬ÎÒÃÇÔ¼¶¨Í¼ÏñµÄ×óÉϽÇÎª×ø±êԵ㡣
ͼÏñµÄ×ø±êÖáÊÇÒ»¸öºÜÓÐÓõĵ÷ÊÔ¹¤¾ß£»µ«ÊÇ£¬Èç¹ûÄãÏë»æÖÆ³ö½ÏÃÀ¹ÛµÄͼÏñ£¬¼ÓÉÏÏÂÁÐÃüÁî¿ÉÒÔÊ¹×ø±êÖá²»ÏÔʾ£º
ÉÏÃæµÄÃüÁ»æÖƳöÈçͼ 1-2 ÓÒ±ßËùʾµÄͼÏñ¡£

ͼ 1-2£ºMatplotlib »æÍ¼Ê¾Àý¡£´øÓÐ×ø±êÖáºÍ²»´ø×ø±êÖáµÄ°üº¬µãºÍÒ»ÌõÏ߶εÄͼÏñ
ÔÚ»æÍ¼Ê±£¬ÓкܶàÑ¡Ïî¿ÉÒÔ¿ØÖÆÍ¼ÏñµÄÑÕÉ«ºÍÑùʽ¡£×îÓÐÓõÄһЩ¶ÌÃüÁîÈç±í
1-1¡¢±í 1-2 ºÍ±í 1-3 Ëùʾ¡£Ê¹Ó÷½·¨¼ûÏÂÃæµÄÀý×Ó£º
plot(x,y) # ĬÈÏΪÀ¶É«ÊµÏß
plot(x,y,'r*') # ºìÉ«ÐÇ×´±ê¼Ç
plot(x,y,'go-') # ´øÓÐԲȦ±ê¼ÇµÄÂÌÏß
plot(x,y,'ks:') # ´øÓÐÕý·½Ðαê¼ÇµÄºÚÉ«ÐéÏß |
±í1-1£ºÓÃPyLab¿â»æÍ¼µÄ»ù±¾ÑÕÉ«¸ñʽÃüÁî
ÑÕÉ« |
'b' |
À¶É« |
'g' |
ÂÌÉ« |
'r' |
ºìÉ« |
'c' |
ÇàÉ« |
'm' |
Æ·ºì |
'y' |
»ÆÉ« |
'k' |
ºÚÉ« |
'w' |
°×É« |
±í1-2£ºÓÃPyLab¿â»æÍ¼µÄ»ù±¾ÏßÐ͸ñʽÃüÁî
ÏßÐÍ |
'.' |
ʵÏß |
'--' |
ÐéÏß |
':' |
µãÏß |
±í1-3£ºÓÃPyLab¿â»æÍ¼µÄ»ù±¾»æÖƱê¼Ç¸ñʽÃüÁî
񈬀 |
'.' |
µã |
'o' |
ԲȦ |
's' |
Õý·½ÐÎ |
'*' |
ÐÇÐÎ |
'+' |
¼ÓºÅ |
'x' |
²æºÅ |
1.2.2¡¡Í¼ÏñÂÖÀªºÍÖ±·½Í¼
ÏÂÃæÀ´¿´Á½¸öÌØ±ðµÄ»æÍ¼Ê¾Àý£ºÍ¼ÏñµÄÂÖÀªºÍÖ±·½Í¼¡£»æÖÆÍ¼ÏñµÄÂÖÀª£¨»òÕ߯äËû¶þάº¯ÊýµÄµÈÂÖÀªÏߣ©ÔÚ¹¤×÷Öзdz£ÓÐÓá£ÒòΪ»æÖÆÂÖÀªÐèÒª¶Ôÿ¸ö×ø±ê
[x, y] µÄÏñËØÖµÊ©¼Óͬһ¸öãÐÖµ£¬ËùÒÔÊ×ÏÈÐèÒª½«Í¼Ïñ»Ò¶È»¯£º
from PIL import
Image
from pylab import *
# ¶ÁȡͼÏñµ½Êý×éÖÐ
im = array(Image.open('empire.jpg').convert('L'))
# н¨Ò»¸öͼÏñ
figure()
# ²»Ê¹ÓÃÑÕÉ«ÐÅÏ¢
gray()
# ÔÚÔµãµÄ×óÉϽÇÏÔʾÂÖÀªÍ¼Ïñ
contour(im, origin='image')
axis('equal')
axis('off') |
Ïñ֮ǰµÄÀý×ÓÒ»Ñù£¬ÕâÀïÓà PIL µÄ convert() ·½·¨½«Í¼Ïñת»»³É»Ò¶ÈͼÏñ¡£
ͼÏñµÄÖ±·½Í¼ÓÃÀ´±íÕ÷¸ÃͼÏñÏñËØÖµµÄ·Ö²¼Çé¿ö¡£ÓÃÒ»¶¨ÊýÄ¿µÄÐ¡Çø¼ä£¨bin£©À´Ö¸¶¨±íÕ÷ÏñËØÖµµÄ·¶Î§£¬Ã¿¸öÐ¡Çø¼ä»áµÃµ½ÂäÈë¸ÃÐ¡Çø¼ä±íʾ·¶Î§µÄÏñËØÊýÄ¿¡£¸Ã£¨»Ò¶È£©Í¼ÏñµÄÖ±·½Í¼¿ÉÒÔʹÓÃ
hist() º¯Êý»æÖÆ£º
figure()
hist(im.flatten(),128)
show() |
hist() º¯ÊýµÄµÚ¶þ¸ö²ÎÊýÖ¸¶¨Ð¡Çø¼äµÄÊýÄ¿¡£ÐèҪעÒâµÄÊÇ£¬ÒòΪ hist() Ö»½ÓÊÜһάÊý×é×÷ΪÊäÈ룬ËùÒÔÎÒÃÇÔÚ»æÖÆÍ¼ÏñÖ±·½Í¼Ö®Ç°£¬±ØÐëÏȶÔͼÏñ½øÐÐѹƽ´¦Àí¡£flatten()
·½·¨½«ÈÎÒâÊý×é°´ÕÕÐÐÓÅÏÈ×¼Ôòת»»³ÉһάÊý×顣ͼ 1-3 ΪµÈÂÖÀªÏߺÍÖ±·½Í¼Í¼Ïñ¡£

ͼ 1-3£ºÓà Matplotlib »æÖÆÍ¼ÏñµÈÂÖÀªÏߺÍÖ±·½Í¼
1.2.3¡¡½»»¥Ê½±ê×¢
ÓÐʱÓû§ÐèÒªºÍijЩӦÓý»»¥£¬ÀýÈçÔÚÒ»·ùͼÏñÖбê¼ÇһЩµã£¬»òÕß±êעһЩѵÁ·Êý¾Ý¡£PyLab
¿âÖÐµÄ ginput() º¯Êý¾Í¿ÉÒÔʵÏÖ½»»¥Ê½±ê×¢¡£ÏÂÃæÊÇÒ»¸ö¼ò¶ÌµÄÀý×Ó£º
from PIL import Image
from pylab import *
im = array(Image.open('empire.jpg'))
imshow(im)
print 'Please click 3 points'
x = ginput(3)
print 'you clicked:',x
show() |
ÉÏÃæµÄ½Å±¾Ê×ÏÈ»æÖÆÒ»·ùͼÏñ£¬È»ºóµÈ´ýÓû§ÔÚ»æÍ¼´°¿ÚµÄͼÏñÇøÓòµã»÷Èý´Î¡£³ÌÐò½«ÕâЩµã»÷µÄ×ø±ê [x,
y] ×Ô¶¯±£´æÔÚ x ÁбíÀï¡£
1.3¡¡NumPy
NumPyÊǷdz£ÓÐÃûµÄ Python ¿ÆÑ§¼ÆË㹤¾ß°ü£¬ÆäÖаüº¬ÁË´óÁ¿ÓÐÓõÄ˼Ï룬±ÈÈçÊý×é¶ÔÏó£¨ÓÃÀ´±íʾÏòÁ¿¡¢¾ØÕó¡¢Í¼ÏñµÈ£©ÒÔ¼°ÏßÐÔ´úÊýº¯Êý¡£NumPy
ÖеÄÊý×é¶ÔÏ󼸺õ¹á´©ÓÃÓÚ±¾ÊéµÄËùÓÐÀý×ÓÖÐ 1 Êý×é¶ÔÏó¿ÉÒÔ°ïÖúÄãʵÏÖÊý×éÖÐÖØÒªµÄ²Ù×÷£¬±ÈÈç¾ØÕó³Ë»ý¡¢×ªÖᢽⷽ³Ìϵͳ¡¢ÏòÁ¿³Ë»ýºÍ¹éÒ»»¯£¬ÕâΪͼÏñ±äÐΡ¢¶Ô±ä»¯½øÐн¨Ä£¡¢Í¼Ïñ·ÖÀࡢͼÏñ¾ÛÀàµÈÌṩÁË»ù´¡¡£
1PyLab ʵ¼ÊÉϰüº¬ NumPy µÄһЩÄÚÈÝ£¬ÈçÊý×éÀàÐÍ¡£ÕâÒ²ÊÇÎÒÃÇÄܹ»ÔÚ 1.2 ½ÚʹÓÃÊý×éÀàÐ͵ÄÔÒò¡£
NumPy
¿ÉÒÔ´Ó Ãâ·ÑÏÂÔØ£¬ÔÚÏß˵Ã÷Îĵµ°üº¬ÁËÄã¿ÉÄÜÓöµ½µÄ´ó¶àÊýÎÊÌâµÄ´ð°¸¡£¹ØÓÚ
NumPy µÄ¸ü¶àÄÚÈÝ£¬Çë²Î¿¼¿ªÔ´Êé¼® [24]¡£
1.3.1¡¡Í¼ÏñÊý×é±íʾ
ÔÚÏÈǰµÄÀý×ÓÖУ¬µ±ÔØÈëͼÏñʱ£¬ÎÒÃÇͨ¹ýµ÷Óà array() ·½·¨½«Í¼Ïñת»»³É NumPy µÄÊý×é¶ÔÏ󣬵«µ±Ê±²¢Ã»ÓнøÐÐÏêϸ½éÉÜ¡£NumPy
ÖеÄÊý×é¶ÔÏóÊǶàάµÄ£¬¿ÉÒÔÓÃÀ´±íʾÏòÁ¿¡¢¾ØÕóºÍͼÏñ¡£Ò»¸öÊý×é¶ÔÏóºÜÏñÒ»¸öÁÐ±í£¨»òÕßÊÇÁбíµÄÁÐ±í£©£¬µ«ÊÇÊý×éÖÐËùÓеÄÔªËØ±ØÐë¾ßÓÐÏàͬµÄÊý¾ÝÀàÐÍ¡£³ý·Ç´´½¨Êý×é¶ÔÏóʱָ¶¨Êý¾ÝÀàÐÍ£¬·ñÔòÊý¾ÝÀàÐͻᰴÕÕÊý¾ÝµÄÀàÐÍ×Ô¶¯È·¶¨¡£
¶ÔÓÚͼÏñÊý¾Ý£¬ÏÂÃæµÄÀý×Ó²ûÊöÁËÕâÒ»µã£º
im = array(Image.open('empire.jpg'))
print im.shape, im.dtype
im = array(Image.open('empire.jpg').convert('L'),'f')
print im.shape, im.dtype
|
¿ØÖÆÌ¨Êä³ö½á¹ûÈçÏÂËùʾ£º
(800, 569, 3)
uint8
(800, 569) float32
|
ÿÐеĵÚÒ»¸öÔª×é±íʾͼÏñÊý×éµÄ´óС£¨ÐС¢ÁС¢ÑÕɫͨµÀ£©£¬½ô½Ó×ŵÄ×Ö·û´®±íʾÊý×éÔªËØµÄÊý¾ÝÀàÐÍ¡£ÒòΪͼÏñͨ³£±»±àÂë³ÉÎÞ·ûºÅ°ËλÕûÊý£¨uint8£©£¬ËùÒÔÔÚµÚÒ»ÖÖÇé¿öÏ£¬ÔØÈëͼÏñ²¢½«Æäת»»µ½Êý×éÖУ¬Êý×éµÄÊý¾ÝÀàÐÍΪ¡°uint8¡±¡£ÔÚµÚ¶þÖÖÇé¿öÏ£¬¶ÔͼÏñ½øÐлҶȻ¯´¦Àí£¬²¢ÇÒÔÚ´´½¨Êý×éʱʹÓöîÍâµÄ²ÎÊý¡°f¡±£»¸Ã²ÎÊý½«Êý¾ÝÀàÐÍת»»Îª¸¡µãÐÍ¡£¹ØÓÚ¸ü¶àÊý¾ÝÀàÐÍÑ¡Ï¿ÉÒԲο¼Í¼Êé
[24]¡£×¢Ò⣬ÓÉÓÚ»Ò¶ÈͼÏñûÓÐÑÕÉ«ÐÅÏ¢£¬ËùÒÔÔÚÐÎ×´Ôª×éÖУ¬ËüÖ»ÓÐÁ½¸öÊýÖµ¡£
Êý×éÖеÄÔªËØ¿ÉÒÔʹÓÃϱê·ÃÎÊ¡£Î»ÓÚ×ø±ê i¡¢j£¬ÒÔ¼°ÑÕɫͨµÀ k µÄÏñËØÖµ¿ÉÒÔÏñÏÂÃæÕâÑù·ÃÎÊ£º
¶à¸öÊý×éÔªËØ¿ÉÒÔʹÓÃÊý×éÇÐÆ¬·½Ê½·ÃÎÊ¡£ÇÐÆ¬·½Ê½·µ»ØµÄÊÇÒÔÖ¸¶¨¼ä¸ôϱê·ÃÎʸÃÊý×éµÄÔªËØÖµ¡£ÏÂÃæÊÇÓйػҶÈͼÏñµÄһЩÀý×Ó£º
im[i,:] = im[j,:] # ½«µÚ j ÐеÄÊýÖµ¸³Öµ¸øµÚ i ÐÐ
im[:,i] = 100 # ½«µÚ i ÁеÄËùÓÐÊýÖµÉèΪ100
im[:100,:50].sum() # ¼ÆËãǰ100 ÐС¢Ç° 50 ÁÐËùÓÐÊýÖµµÄºÍ
im[50:100,50:100] # 50~100 ÐУ¬50~100 ÁУ¨²»°üÀ¨µÚ 100
ÐÐºÍµÚ 100 ÁУ©
im[i].mean() # µÚ i ÐÐËùÓÐÊýÖµµÄƽ¾ùÖµ
im[:,-1] # ×îºóÒ»ÁÐ
im[-2,:] (or im[-2]) # µ¹ÊýµÚ¶þÐÐ |
×¢Ò⣬ʾÀý½ö½öʹÓÃÒ»¸öϱê·ÃÎÊÊý×é¡£Èç¹û½öʹÓÃÒ»¸öϱ꣬Ôò¸ÃϱêΪÐÐϱꡣעÒ⣬ÔÚ×îºó¼¸¸öÀý×ÓÖУ¬¸ºÊýÇÐÆ¬±íʾ´Ó×îºóÒ»¸öÔªËØÄæÏò¼ÆÊý¡£ÎÒÃǽ«»áƵ·±µØÊ¹ÓÃÇÐÆ¬¼¼Êõ·ÃÎÊÏñËØÖµ£¬ÕâÒ²ÊÇÒ»¸öºÜÖØÒªµÄ˼Ïë¡£
ÎÒÃÇÓкܶà²Ù×÷ºÍ·½·¨À´´¦ÀíÊý×é¶ÔÏó¡£±¾Ê齫ÔÚʹÓõ½µÄµØ·½ÖðÒ»½éÉÜ¡£Äã¿ÉÒÔ²éÔÄÔÚÏßÎĵµ»òÕß¿ªÔ´Í¼Êé
[24] »ñÈ¡¸ü¶àÐÅÏ¢¡£
1.3.2¡¡»Ò¶È±ä»»
½«Í¼Ïñ¶ÁÈë NumPy Êý×é¶ÔÏóºó£¬ÎÒÃÇ¿ÉÒÔ¶ÔËüÃÇÖ´ÐÐÈÎÒâÊýѧ²Ù×÷¡£Ò»¸ö¼òµ¥µÄÀý×Ó¾ÍÊÇͼÏñµÄ»Ò¶È±ä»»¡£¿¼ÂÇÈÎÒ⺯Êý
f£¬Ëü½« 0...255 Çø¼ä£¨»òÕß 0...1 Çø¼ä£©Ó³Éäµ½×ÔÉí£¨Òâ˼ÊÇ˵£¬Êä³öÇø¼äµÄ·¶Î§ºÍÊäÈëÇø¼äµÄ·¶Î§Ïàͬ£©¡£ÏÂÃæÊǹØÓڻҶȱ任µÄһЩÀý×Ó£º
from PIL import Image
from numpy import *
im = array(Image.open('empire.jpg').convert('L'))
im2 = 255 - im # ¶ÔͼÏñ½øÐз´Ïà´¦Àí
im3 = (100.0/255) * im + 100 # ½«Í¼ÏñÏñËØÖµ±ä»»µ½100...200
Çø¼ä
im4 = 255.0 * (im/255.0)**2 # ¶ÔͼÏñÏñËØÖµÇ󯽷½ºóµÃµ½µÄͼÏñ |
µÚÒ»¸öÀý×Ó½«»Ò¶ÈͼÏñ½øÐз´Ïà´¦Àí£»µÚ¶þ¸öÀý×Ó½«Í¼ÏñµÄÏñËØÖµ±ä»»µ½
100...200 Çø¼ä£»µÚÈý¸öÀý×Ó¶ÔͼÏñʹÓöþ´Îº¯Êý±ä»»£¬Ê¹½Ï°µµÄÏñËØÖµ±äµÃ¸üС¡£Í¼ 1-4 ΪËùʹÓõı任º¯ÊýͼÏñ¡£Í¼
1-5 ÊÇÊä³öµÄͼÏñ½á¹û¡£Äã¿ÉÒÔʹÓÃÏÂÃæµÄÃüÁî²é¿´Í¼ÏñÖеÄ×îСºÍ×î´óÏñËØÖµ£º
print int(im.min()),
int(im.max()) |

ͼ 1-4£º»Ò¶È±ä»»Ê¾Àý¡£Èý¸öÀý×ÓÖÐËùʹÓú¯ÊýµÄͼÏñ£¬ÆäÖÐÐéÏß±íʾºãµÈ±ä»»

ͼ 1-5£º»Ò¶È±ä»»¡£¶ÔͼÏñÓ¦ÓÃͼ 1-4 Öеĺ¯Êý£ºf(x)=255-x ¶ÔͼÏñ½øÐз´Ïà´¦Àí£¨×󣩣»f(x)=(100/255)x+100
¶ÔͼÏñ½øÐб任£¨ÖУ©£»f(x)=255(x/255)2 ¶ÔͼÏñ×ö¶þ´Î±ä»»£¨ÓÒ£©
Èç¹ûÊÔ×ŶÔÉÏÃæÀý×Ӳ鿴×îСֵºÍ×î´óÖµ£¬¿ÉÒԵõ½ÏÂÃæµÄÊä³ö½á¹û£º
2 255
0 253
100 200
0 255 |
array() ±ä»»µÄÏà·´²Ù×÷¿ÉÒÔʹÓà PIL µÄ fromarray()
º¯ÊýÍê³É£º
pil_im = Image.fromarray(im) |
Èç¹ûÄãͨ¹ýһЩ²Ù×÷½«¡°uint8¡±Êý¾ÝÀàÐÍת»»ÎªÆäËûÊý¾ÝÀàÐÍ£¬±ÈÈç֮ǰÀý×ÓÖеÄ
im3 »òÕß im4£¬ÄÇôÔÚ´´½¨ PIL ͼÏñ֮ǰ£¬ÐèÒª½«Êý¾ÝÀàÐÍת»»»ØÀ´£º
pil_im = Image.fromarray(uint8(im)) |
Èç¹ûÄã²¢²»Ê®·ÖÈ·¶¨ÊäÈëÊý¾ÝµÄÀàÐÍ£¬°²È«Æð¼û£¬Ó¦¸ÃÏÈת»»»ØÀ´¡£×¢Ò⣬NumPy ×ÜÊǽ«Êý×éÊý¾ÝÀàÐÍת»»³ÉÄܹ»±íʾÊý¾ÝµÄ¡°×îµÍ¡±Êý¾ÝÀàÐÍ¡£¶Ô¸¡µãÊý×ö³Ë»ý»ò³ý·¨²Ù×÷»áʹÕûÊýÀàÐ͵ÄÊý×é±ä³É¸¡µãÀàÐÍ¡£
1.3.3¡¡Í¼ÏñËõ·Å
NumPy µÄÊý×é¶ÔÏóÊÇÎÒÃÇ´¦ÀíͼÏñºÍÊý¾ÝµÄÖ÷Òª¹¤¾ß¡£ÏëÒª¶ÔͼÏñ½øÐÐËõ·Å´¦ÀíûÓÐÏֳɼòµ¥µÄ·½·¨¡£ÎÒÃÇ¿ÉÒÔʹÓÃ֮ǰ
PIL ¶ÔͼÏñ¶ÔÏóת»»µÄ²Ù×÷£¬Ð´Ò»¸ö¼òµ¥µÄÓÃÓÚͼÏñËõ·ÅµÄº¯Êý¡£°ÑÏÂÃæµÄº¯ÊýÌí¼Óµ½ imtool.py
ÎļþÀ
def imresize(im,sz):
""" ʹÓÃPIL ¶ÔÏóÖØÐ¶¨ÒåͼÏñÊý×éµÄ´óС"""
pil_im = Image.fromarray(uint8(im))
return array(pil_im.resize(sz)) |
ÎÒÃǽ«»áÔÚ½ÓÏÂÀ´µÄÄÚÈÝÖÐʹÓÃÕâ¸öº¯Êý¡£
1.3.4¡¡Ö±·½Í¼¾ùºâ»¯
ͼÏñ»Ò¶È±ä»»ÖÐÒ»¸ö·Ç³£ÓÐÓõÄÀý×Ó¾ÍÊÇÖ±·½Í¼¾ùºâ»¯¡£Ö±·½Í¼¾ùºâ»¯ÊÇÖ¸½«Ò»·ùͼÏñµÄ»Ò¶ÈÖ±·½Í¼±äƽ£¬Ê¹±ä»»ºóµÄͼÏñÖÐÿ¸ö»Ò¶ÈÖµµÄ·Ö²¼¸ÅÂʶ¼Ïàͬ¡£ÔÚ¶ÔͼÏñ×ö½øÒ»²½´¦Àí֮ǰ£¬Ö±·½Í¼¾ùºâ»¯Í¨³£ÊǶÔͼÏñ»Ò¶ÈÖµ½øÐйéÒ»»¯µÄÒ»¸ö·Ç³£ºÃµÄ·½·¨£¬²¢ÇÒ¿ÉÒÔÔöǿͼÏñµÄ¶Ô±È¶È¡£
ÔÚÕâÖÖÇé¿öÏ£¬Ö±·½Í¼¾ùºâ»¯µÄ±ä»»º¯ÊýÊÇͼÏñÖÐÏñËØÖµµÄÀÛ»ý·Ö²¼º¯Êý£¨cumulative distribution
function£¬¼òдΪ cdf£¬½«ÏñËØÖµµÄ·¶Î§Ó³É䵽Ŀ±ê·¶Î§µÄ¹éÒ»»¯²Ù×÷£©¡£
ÏÂÃæµÄº¯ÊýÊÇÖ±·½Í¼¾ùºâ»¯µÄ¾ßÌåʵÏÖ¡£½«Õâ¸öº¯ÊýÌí¼Óµ½ imtool.py
À
def histeq(im,nbr_bins=256):
""" ¶ÔÒ»·ù»Ò¶ÈͼÏñ½øÐÐÖ±·½Í¼¾ùºâ»¯"""
# ¼ÆËãͼÏñµÄÖ±·½Í¼
imhist,bins = histogram(im.flatten(),nbr_bins,normed=True)
cdf = imhist.cumsum() # cumulative distribution
function
cdf = 255 * cdf / cdf[-1] # ¹éÒ»»¯
# ʹÓÃÀÛ»ý·Ö²¼º¯ÊýµÄÏßÐÔ²åÖµ£¬¼ÆËãеÄÏñËØÖµ
im2 = interp(im.flatten(),bins[:-1],cdf)
return im2.reshape(im.shape), cdf |
¸Ãº¯ÊýÓÐÁ½¸öÊäÈë²ÎÊý£¬Ò»¸öÊǻҶÈͼÏñ£¬Ò»¸öÊÇÖ±·½Í¼ÖÐʹÓÃÐ¡Çø¼äµÄÊýÄ¿¡£º¯Êý·µ»ØÖ±·½Í¼¾ùºâ»¯ºóµÄͼÏñ£¬ÒÔ¼°ÓÃÀ´×öÏñËØÖµÓ³ÉäµÄÀÛ»ý·Ö²¼º¯Êý¡£×¢Ò⣬º¯ÊýÖÐʹÓõ½ÀÛ»ý·Ö²¼º¯ÊýµÄ×îºóÒ»¸öÔªËØ£¨Ï±êΪ
-1£©£¬Ä¿µÄÊǽ«Æä¹éÒ»»¯µ½ 0...1 ·¶Î§¡£Äã¿ÉÒÔÏñÏÂÃæÕâÑùʹÓøú¯Êý£º
from PIL import Image
from numpy import *
im = array(Image.open('AquaTermi_lowcontrast.jpg').convert('L'))
im2,cdf = imtools.histeq(im) |
ͼ 1-6 ºÍͼ 1-7 ΪÉÏÃæÖ±·½Í¼¾ùºâ»¯Àý×ӵĽá¹û¡£ÉÏÃæÒ»ÐÐÏÔʾµÄ·Ö±ðÊÇÖ±·½Í¼¾ùºâ»¯Ö®Ç°ºÍÖ®ºóµÄ»Ò¶ÈÖ±·½Í¼£¬ÒÔ¼°ÀÛ»ý¸ÅÂÊ·Ö²¼º¯ÊýÓ³ÉäͼÏñ¡£¿ÉÒÔ¿´µ½£¬Ö±·½Í¼¾ùºâ»¯ºóͼÏñµÄ¶Ô±È¶ÈÔöÇ¿ÁË£¬ÔÏÈͼÏñ»ÒÉ«ÇøÓòµÄϸ½Ú±äµÃÇåÎú¡£

ͼ 1-6£ºÖ±·½Í¼¾ùºâ»¯Ê¾Àý¡£×ó²àΪÔʼͼÏñºÍÖ±·½Í¼£¬ÖмäͼΪ»Ò¶È±ä»»º¯Êý£¬ÓÒ²àΪֱ·½Í¼¾ùºâ»¯ºóµÄͼÏñºÍÏàÓ¦Ö±·½Í¼

ͼ 1-7£ºÖ±·½Í¼¾ùºâ»¯Ê¾Àý¡£×ó²àΪÔʼͼÏñºÍÖ±·½Í¼£¬ÖмäͼΪ»Ò¶È±ä»»º¯Êý£¬ÓÒ²àΪֱ·½Í¼¾ùºâ»¯ºóµÄͼÏñºÍÏàÓ¦Ö±·½Í¼
1.3.5¡¡Í¼Ïñƽ¾ù
ͼÏñƽ¾ù²Ù×÷ÊǼõÉÙͼÏñÔëÉùµÄÒ»ÖÖ¼òµ¥·½Ê½£¬Í¨³£ÓÃÓÚÒÕÊõÌØÐ§¡£ÎÒÃÇ¿ÉÒÔ¼òµ¥µØ´ÓͼÏñÁбíÖмÆËã³öÒ»·ùƽ¾ùͼÏñ¡£¼ÙÉèËùÓеÄͼÏñ¾ßÓÐÏàͬµÄ´óС£¬ÎÒÃÇ¿ÉÒÔ½«ÕâЩͼÏñ¼òµ¥µØÏà¼Ó£¬È»ºó³ýÒÔͼÏñµÄÊýÄ¿£¬À´¼ÆËãÆ½¾ùͼÏñ¡£ÏÂÃæµÄº¯Êý¿ÉÒÔÓÃÓÚ¼ÆËãÆ½¾ùͼÏñ£¬½«ÆäÌí¼Óµ½
imtool.py ÎļþÀ
def compute_average(imlist): """
¼ÆËãͼÏñÁбíµÄƽ¾ùͼÏñ"""
# ´ò¿ªµÚÒ»·ùͼÏñ£¬½«Æä´æ´¢ÔÚ¸¡µãÐÍÊý×éÖÐ
averageim = array(Image.open(imlist[0]), 'f')
for imname in imlist[1:]:
try:
averageim += array(Image.open(imname))
except:
print imname + '...skipped'
averageim /= len(imlist)
# ·µ»Øuint8 ÀàÐÍµÄÆ½¾ùͼÏñ
return array(averageim, 'uint8') |
¸Ãº¯Êý°üÀ¨Ò»Ð©»ù±¾µÄÒì³£´¦Àí¼¼ÇÉ£¬¿ÉÒÔ×Ô¶¯Ìø¹ý²»ÄÜ´ò¿ªµÄͼÏñ¡£ÎÒÃÇ»¹¿ÉÒÔʹÓà mean() º¯Êý¼ÆËãÆ½¾ùͼÏñ¡£mean()
º¯ÊýÐèÒª½«ËùÓеÄͼÏñ¶Ñ»ýµ½Ò»¸öÊý×éÖУ»Ò²¾ÍÊÇ˵£¬Èç¹ûÓкܶàͼÏñ£¬¸Ã´¦Àí·½Ê½ÐèÒªÕ¼ÓúܶàÄÚ´æ¡£ÎÒÃǽ«»áÔÚÏÂÒ»½ÚÖÐʹÓøú¯Êý¡£
1.3.6¡¡Í¼ÏñµÄÖ÷³É·Ö·ÖÎö£¨PCA£©
PCA£¨Principal Component Analysis£¬Ö÷³É·Ö·ÖÎö£©ÊÇÒ»¸ö·Ç³£ÓÐÓõĽµÎ¬¼¼ÇÉ¡£Ëü¿ÉÒÔÔÚʹÓþ¡¿ÉÄÜÉÙάÊýµÄǰÌáÏ£¬¾¡Á¿¶àµØ±£³ÖѵÁ·Êý¾ÝµÄÐÅÏ¢£¬ÔÚ´ËÒâÒåÉÏÊÇÒ»¸ö×î¼Ñ¼¼ÇÉ¡£¼´Ê¹ÊÇÒ»·ù
100¡Á100 ÏñËØµÄС»Ò¶ÈͼÏñ£¬Ò²ÓÐ 10 000 ά£¬¿ÉÒÔ¿´³É 10 000 ά¿Õ¼äÖеÄÒ»¸öµã¡£Ò»Õ×ÏñËØµÄͼÏñ¾ßÓаÙÍòά¡£ÓÉÓÚͼÏñ¾ßÓкܸߵÄάÊý£¬ÔÚÐí¶à¼ÆËã»úÊÓ¾õÓ¦ÓÃÖУ¬ÎÒÃǾ³£Ê¹ÓýµÎ¬²Ù×÷¡£PCA
²úÉúµÄͶӰ¾ØÕó¿ÉÒÔ±»ÊÓΪ½«ÔÊ¼×ø±ê±ä»»µ½ÏÖÓеÄ×ø±êϵ£¬×ø±êϵÖеĸ÷¸ö×ø±ê°´ÕÕÖØÒªÐԵݼõÅÅÁС£
ΪÁ˶ÔͼÏñÊý¾Ý½øÐÐ PCA ±ä»»£¬Í¼ÏñÐèҪת»»³ÉһάÏòÁ¿±íʾ¡£ÎÒÃÇ¿ÉÒÔʹÓà NumPy Àà¿âÖеÄ
flatten() ·½·¨½øÐб任¡£
½«±äƽµÄͼÏñ¶Ñ»ýÆðÀ´£¬ÎÒÃÇ¿ÉÒԵõ½Ò»¸ö¾ØÕ󣬾ØÕóµÄÒ»Ðбíʾһ·ùͼÏñ¡£ÔÚ¼ÆËãÖ÷·½Ïò֮ǰ£¬ËùÓеÄÐÐͼÏñ°´ÕÕÆ½¾ùͼÏñ½øÐÐÁËÖÐÐÄ»¯¡£ÎÒÃÇͨ³£Ê¹ÓÃ
SVD£¨Singular Value Decomposition£¬ÆæÒìÖµ·Ö½â£©·½·¨À´¼ÆËãÖ÷³É·Ö£»µ«µ±¾ØÕóµÄάÊýºÜ´óʱ£¬SVD
µÄ¼ÆËã·Ç³£Âý£¬ËùÒÔ´Ëʱͨ³£²»Ê¹Óà SVD ·Ö½â¡£ÏÂÃæ¾ÍÊÇ PCA ²Ù×÷µÄ´úÂ룺
from PIL import
Image
from numpy import *
def pca(X): """ Ö÷³É·Ö·ÖÎö£º
ÊäÈ룺¾ØÕóX £¬ÆäÖиþØÕóÖд洢ѵÁ·Êý¾Ý£¬Ã¿Ò»ÐÐΪһÌõѵÁ·Êý¾Ý
·µ»Ø£ºÍ¶Ó°¾ØÕ󣨰´ÕÕά¶ÈµÄÖØÒªÐÔÅÅÐò£©¡¢·½²îºÍ¾ùÖµ"""
# »ñȡάÊý
num_data,dim = X.shape
# Êý¾ÝÖÐÐÄ»¯
mean_X = X.mean(axis=0)
X = X - mean_X
if dim>num_data:
# PCA- ʹÓýôÖ¼¼ÇÉ
M = dot(X,X.T) # з½²î¾ØÕó
e,EV = linalg.eigh(M) # ÌØÕ÷ÖµºÍÌØÕ÷ÏòÁ¿
tmp = dot(X.T,EV).T # Õâ¾ÍÊǽôÖ¼¼ÇÉ
V = tmp[::-1] # ÓÉÓÚ×îºóµÄÌØÕ÷ÏòÁ¿ÊÇÎÒÃÇËùÐèÒªµÄ£¬ËùÒÔÐèÒª½«ÆäÄæ×ª
S = sqrt(e)[::-1] # ÓÉÓÚÌØÕ÷ÖµÊǰ´ÕÕµÝÔö˳ÐòÅÅÁеģ¬ËùÒÔÐèÒª½«ÆäÄæ×ª
for i in range(V.shape[1]):
V[:,i] /= S
else:
# PCA- ʹÓÃSVD ·½·¨
U,S,V = linalg.svd(X)
V = V[:num_data] # ½ö½ö·µ»ØÇ°nun_data άµÄÊý¾Ý²ÅºÏÀí
# ·µ»ØÍ¶Ó°¾ØÕó¡¢·½²îºÍ¾ùÖµ
return V,S,mean_X
|
¸Ãº¯ÊýÊ×ÏÈͨ¹ý¼õȥÿһάµÄ¾ùÖµ½«Êý¾ÝÖÐÐÄ»¯£¬È»ºó¼ÆËãз½²î¾ØÕó¶ÔÓ¦×î´óÌØÕ÷ÖµµÄÌØÕ÷ÏòÁ¿£¬´Ëʱ¿ÉÒÔʹÓüòÃ÷µÄ¼¼ÇÉ»òÕß
SVD ·Ö½â¡£ÕâÀïÎÒÃÇʹÓÃÁË range() º¯Êý£¬¸Ãº¯ÊýµÄÊäÈë²ÎÊýΪһ¸öÕûÊý n£¬º¯Êý·µ»ØÕûÊý 0...(n-1)
µÄÒ»¸öÁÐ±í¡£ÄãÒ²¿ÉÒÔʹÓà arange() º¯ÊýÀ´·µ»ØÒ»¸öÊý×飬»òÕßʹÓà xrange() º¯Êý·µ»ØÒ»¸ö²úÉúÆ÷£¨¿ÉÄÜ»áÌáÉýËÙ¶È£©¡£ÎÒÃÇÔÚ±¾ÊéÖйᴩʹÓÃ
range() º¯Êý¡£
Èç¹ûÊý¾Ý¸öÊýСÓÚÏòÁ¿µÄάÊý£¬ÎÒÃDz»Óà SVD ·Ö½â£¬¶øÊǼÆËãάÊý¸üСµÄз½²î¾ØÕó XXT µÄÌØÕ÷ÏòÁ¿¡£Í¨¹ý½ö¼ÆËã¶ÔӦǰ
k£¨k ÊǽµÎ¬ºóµÄάÊý£©×î´óÌØÕ÷ÖµµÄÌØÕ÷ÏòÁ¿£¬¿ÉÒÔʹÉÏÃæµÄ PCA ²Ù×÷¸ü¿ì¡£ÓÉÓÚÆª·ùËùÏÞ£¬ÓÐÐËȤµÄ¶ÁÕß¿ÉÒÔ×ÔÐÐ̽Ë÷¡£¾ØÕó
V µÄÿÐÐÏòÁ¿¶¼ÊÇÕý½»µÄ£¬²¢ÇÒ°üº¬ÁËѵÁ·Êý¾Ý·½²îÒÀ´Î¼õÉÙµÄ×ø±ê·½Ïò¡£
ÎÒÃǽÓÏÂÀ´¶Ô×ÖÌåͼÏñ½øÐÐ PCA ±ä»»¡£fontimages.zip Îļþ°üº¬²ÉÓò»Í¬×ÖÌåµÄ×Ö·û
a µÄËõÂÔͼ¡£ËùÓÐµÄ 2359 ÖÖ×ÖÌå¿ÉÒÔÃâ·ÑÏÂÔØ 2¡£¼Ù¶¨ÕâЩͼÏñµÄÃû³Æ±£´æÔÚÁбí imlist
ÖУ¬¸ú֮ǰµÄ´úÂëÒ»Æð±£´æ´«ÔÚ pca.py ÎļþÖУ¬ÎÒÃÇ¿ÉÒÔʹÓÃÏÂÃæµÄ½Å±¾¼ÆËãͼÏñµÄÖ÷³É·Ö£º
2Ãâ·Ñ×ÖÌåͼÏñ¿âÓÉ Martin Solli ÊÕ¼¯²¢ÉÏ´«£¨http://webstaff.itn.liu.se/~marso/£©¡£
from PIL import Image
from numpy import *
from pylab import *
import pca
im = array(Image.open(imlist[0])) # ´ò¿ªÒ»·ùͼÏñ£¬»ñÈ¡Æä´óС
m,n = im.shape[0:2] # »ñȡͼÏñµÄ´óС
imnbr = len(imlist) # »ñȡͼÏñµÄÊýÄ¿
# ´´½¨¾ØÕ󣬱£´æËùÓÐѹƽºóµÄͼÏñÊý¾Ý
immatrix = array([array(Image.open(im)).flatten()
for im in imlist],'f')
# Ö´ÐÐ PCA ²Ù×÷
V,S,immean = pca.pca(immatrix)
# ÏÔʾһЩͼÏñ£¨¾ùֵͼÏñºÍǰ 7 ¸öģʽ£©
figure()
gray()
subplot(2,4,1)
imshow(immean.reshape(m,n))
for i in range(7):
subplot(2,4,i+2)
imshow(V[i].reshape(m,n))
|
×¢Ò⣬ͼÏñÐèÒª´Óһά±íÊ¾ÖØÐÂת»»³É¶þάͼÏñ£»¿ÉÒÔʹÓà reshape() º¯Êý¡£Èçͼ 1-8 Ëùʾ£¬ÔËÐиÃÀý×Ó»áÔÚÒ»¸ö»æÍ¼´°¿ÚÖÐÏÔʾ
8 ¸öͼÏñ¡£ÕâÀïÎÒÃÇʹÓÃÁË PyLab ¿âµÄ subplot() º¯ÊýÔÚÒ»¸ö´°¿ÚÖзÅÖöà¸öͼÏñ¡£

ͼ 1-8£ºÆ½¾ùͼÏñ£¨×óÉÏ£©ºÍǰ 7 ¸öģʽ£¨¾ßÓÐ×î´ó·½²îµÄ·½Ïòģʽ£©
1.3.7¡¡Ê¹ÓÃpickleÄ£¿é
Èç¹ûÏëÒª±£´æÒ»Ð©½á¹û»òÕßÊý¾ÝÒÔ·½±ãºóÐøÊ¹Óã¬Python ÖÐµÄ pickle Ä£¿é·Ç³£ÓÐÓá£pickle
Ä£¿é¿ÉÒÔ½ÓÊܼ¸ºõËùÓÐµÄ Python ¶ÔÏ󣬲¢ÇÒ½«Æäת»»³É×Ö·û´®±íʾ£¬¸Ã¹ý³Ì½Ð×ö·â×°£¨pickling£©¡£´Ó×Ö·û´®±íʾÖÐÖØ¹¹¸Ã¶ÔÏ󣬳ÆÎª²ð·â£¨unpickling£©¡£ÕâЩ×Ö·û´®±íʾ¿ÉÒÔ·½±ãµØ´æ´¢ºÍ´«Êä¡£
ÎÒÃÇÀ´¿´Ò»¸öÀý×Ó¡£¼ÙÉèÏëÒª±£´æÉÏÒ»½Ú×ÖÌåͼÏñµÄƽ¾ùͼÏñºÍÖ÷³É·Ö£¬¿ÉÒÔÕâÑùÀ´Íê³É£º
# ±£´æ¾ùÖµºÍÖ÷³É·ÖÊý¾Ý
f = open('font_pca_modes.pkl', 'wb')
pickle.dump(immean,f)
pickle.dump(V,f)
f.close() |
ÔÚÉÏÊöÀý×ÓÖУ¬Ðí¶à¶ÔÏó¿ÉÒÔ±£´æµ½Í¬Ò»¸öÎļþÖС£pickle Ä£¿éÖÐÓкܶ಻ͬµÄÐÒé¿ÉÒÔÉú³É
.pkl Îļþ£»Èç¹û²»È·¶¨µÄ»°£¬×îºÃÒÔ¶þ½øÖÆÎļþµÄÐÎʽ¶ÁÈ¡ºÍдÈë¡£ÔÚÆäËû Python »á»°ÖÐÔØÈëÊý¾Ý£¬Ö»ÐèÒªÈçÏÂʹÓÃ
load() ·½·¨£º
# ÔØÈë¾ùÖµºÍÖ÷³É·ÖÊý¾Ý
f = open('font_pca_modes.pkl', 'rb')
immean = pickle.load(f)
V = pickle.load(f)
f.close() |
×¢Òâ£¬ÔØÈë¶ÔÏóµÄ˳Ðò±ØÐëºÍÏÈǰ±£´æµÄÒ»Ñù¡£Python ÖÐÓиöÓÃ
C ÓïÑÔдµÄÓÅ»¯°æ±¾£¬½Ð×ö cpickle Ä£¿é£¬¸ÃÄ£¿éºÍ±ê×¼ pickle Ä£¿éÍêÈ«¼æÈÝ¡£¹ØÓÚ pickle
Ä£¿éµÄ¸ü¶àÄÚÈÝ£¬²Î¼û
pickle Ä£¿éÎĵµÒ³ ¡£
ÔÚ±¾Êé½ÓÏÂÀ´µÄÕ½ÚÖУ¬ÎÒÃǽ«Ê¹Óà with Óï¾ä´¦ÀíÎļþµÄ¶Áд²Ù×÷¡£ÕâÊÇ
Python 2.5 ÒýÈëµÄ˼Ï룬¿ÉÒÔ×Ô¶¯´ò¿ªºÍ¹Ø±ÕÎļþ£¨¼´Ê¹ÔÚÎļþ´ò¿ªÊ±·¢Éú´íÎ󣩡£ÏÂÃæµÄÀý×ÓʹÓÃ
with() À´ÊµÏÖ±£´æºÍÔØÈë²Ù×÷£º
# ´ò¿ªÎļþ²¢±£´æ
with open('font_pca_modes.pkl', 'wb') as f:
pickle.dump(immean,f)
pickle.dump(V,f) |
ºÍ
# ´ò¿ªÎļþ²¢ÔØÈë
with open('font_pca_modes.pkl', 'rb') as f:
immean = pickle.load(f)
V = pickle.load(f) |
ÉÏÃæµÄÀý×ÓÕ§¿´ÆðÀ´¿ÉÄÜºÜÆæ¹Ö£¬µ« with() ȷʵÊǸöºÜÓÐÓõÄ˼Ïë¡£Èç¹ûÄ㲻ϲ»¶Ëü£¬¿ÉÒÔʹÓÃ֮ǰµÄ
open ºÍ closeº¯Êý¡£
×÷Ϊ pickle µÄÒ»ÖÖÌæ´ú·½Ê½£¬NumPy ¾ßÓжÁдÎı¾ÎļþµÄ¼òµ¥º¯Êý¡£Èç¹ûÊý¾ÝÖв»°üº¬¸´ÔÓµÄÊý¾Ý½á¹¹£¬±ÈÈçÔÚÒ»·ùͼÏñÉϵã»÷µÄµãÁÐ±í£¬NumPy
µÄ¶Áдº¯Êý»áºÜÓÐÓᣱ£´æÒ»¸öÊý×é x µ½ÎļþÖУ¬¿ÉÒÔʹÓãº
savetxt('test.txt',x,'%i') |
×îºóÒ»¸ö²ÎÊý±íʾӦ¸ÃʹÓÃÕûÊý¸ñʽ¡£ÀàËÆµØ£¬¶ÁÈ¡¿ÉÒÔʹÓãº
Äã¿ÉÒÔ´ÓÔÚÏßÎĵµ
Á˽â¸ü¶àÄÚÈÝ¡£
×îºó£¬NumPy ÓÐרÃÅÓÃÓÚ±£´æºÍÔØÈëÊý×éµÄº¯Êý¡£Äã¿ÉÒÔÔÚÉÏÃæµÄÔÚÏßÎĵµÀï²é¿´¹ØÓÚ save()
ºÍ load() µÄ¸ü¶àÄÚÈÝ¡£
1.4¡¡SciPy
SciPy Êǽ¨Á¢ÔÚ NumPy »ù´¡ÉÏ£¬ÓÃÓÚÊýÖµÔËËãµÄ¿ªÔ´¹¤¾ß°ü¡£SciPy
ÌṩºÜ¶à¸ßЧµÄ²Ù×÷£¬¿ÉÒÔʵÏÖÊýÖµ»ý·Ö¡¢ÓÅ»¯¡¢Í³¼Æ¡¢ÐźŴ¦Àí£¬ÒÔ¼°¶ÔÎÒÃÇÀ´Ëµ×îÖØÒªµÄͼÏñ´¦Àí¹¦ÄÜ¡£½ÓÏÂÀ´£¬±¾½Ú»á½éÉÜ
SciPy ÖдóÁ¿ÓÐÓõÄÄ£¿é¡£SciPy ÊǸö¿ªÔ´¹¤¾ß°ü.
ÏÂÔØ¡£
1.4.1¡¡Í¼ÏñÄ£ºý
ͼÏñµÄ¸ß˹ģºýÊǷdz£¾µäµÄͼÏñ¾í»ýÀý×Ó¡£±¾ÖÊÉÏ£¬Í¼ÏñÄ£ºý¾ÍÊǽ«£¨»Ò¶È£©Í¼Ïñ I ºÍÒ»¸ö¸ß˹ºË½øÐоí»ý²Ù×÷£º
I¦Ò = I*G¦Ò
ÆäÖÐ * ±íʾ¾í»ý²Ù×÷£»G¦Ò ÊDZê×¼²îΪ ¦Ò µÄ¶þά¸ß˹ºË£¬¶¨ÒåΪ :

¸ß˹ģºýͨ³£ÊÇÆäËûͼÏñ´¦Àí²Ù×÷µÄÒ»²¿·Ö£¬±ÈÈçͼÏñ²åÖµ²Ù×÷¡¢ÐËȤµã¼ÆËãÒÔ¼°ºÜ¶àÆäËûÓ¦Óá£
SciPy ÓÐÓÃÀ´×öÂ˲¨²Ù×÷µÄ scipy.ndimage.filters
Ä£¿é¡£¸ÃÄ£¿éʹÓÿìËÙһά·ÖÀëµÄ·½Ê½À´¼ÆËã¾í»ý¡£Äã¿ÉÒÔÏñÏÂÃæÕâÑùÀ´Ê¹ÓÃËü£º
from PIL import
Image
from numpy import *
from scipy.ndimage import filters
im = array(Image.open('empire.jpg').convert('L'))
im2 = filters.gaussian_filter(im,5) |
ÉÏÃæ guassian_filter() º¯ÊýµÄ×îºóÒ»¸ö²ÎÊý±íʾ±ê×¼²î¡£
ͼ 1-9 ÏÔʾÁËËæ×Å ¦Ò µÄÔö¼Ó£¬Ò»·ùͼÏñ±»Ä£ºýµÄ³Ì¶È¡£¦Ò Ô½´ó£¬´¦ÀíºóµÄͼÏñϸ½Ú¶ªÊ§Ô½¶à¡£Èç¹û´òËãÄ£ºýÒ»·ù²ÊɫͼÏñ£¬Ö»Ðè¼òµ¥µØ¶Ôÿһ¸öÑÕɫͨµÀ½øÐиß˹ģºý£º
im = array(Image.open('empire.jpg'))
im2 = zeros(im.shape)
for i in range(3):
im2[:,:,i] = filters.gaussian_filter(im[:,:,i],5)
im2 = uint8(im2) |
ÔÚÉÏÃæµÄ½Å±¾ÖУ¬×îºó²¢²»×ÜÊÇÐèÒª½«Í¼Ïñת»»³É uint8 ¸ñʽ£¬ÕâÀïÖ»Êǽ«ÏñËØÖµÓðËλÀ´±íʾ¡£ÎÒÃÇÒ²¿ÉÒÔʹÓãº
À´Íê³Éת»»¡£
¹ØÓÚ¸ÃÄ£¿é¸ü¶àµÄÄÚÈÝÒÔ¼°²»Í¬²ÎÊýµÄÑ¡Ôñ£¬Çë²é¿´
ÉÏ SciPy ÎĵµÖÐµÄ scipy.ndimage ²¿·Ö¡£
ͼ 1-9£ºÊ¹Óà scipy.ndimage.filters Ä£¿é½øÐиß˹ģºý£º£¨a£©Ôʼ»Ò¶ÈͼÏñ£»£¨b£©Ê¹ÓÃ
¦Ò=2 µÄ¸ß˹Â˲¨Æ÷£»£¨c£©Ê¹Óà ¦Ò=5 µÄ¸ß˹Â˲¨Æ÷£»£¨d£©Ê¹Óà ¦Ò=10 µÄ¸ß˹Â˲¨Æ÷
1.4.2¡¡Í¼Ïñµ¼Êý
Õû±¾ÊéÖпÉÒÔ¿´µ½£¬ÔںܶàÓ¦ÓÃÖÐͼÏñÇ¿¶ÈµÄ±ä»¯Çé¿öÊǷdz£ÖØÒªµÄÐÅÏ¢¡£Ç¿¶ÈµÄ±ä»¯¿ÉÒÔÓûҶÈͼÏñ I£¨¶ÔÓÚ²ÊɫͼÏñ£¬Í¨³£¶Ôÿ¸öÑÕɫͨµÀ·Ö±ð¼ÆËãµ¼Êý£©µÄ
x ºÍ y ·½Ïòµ¼Êý Ix ºÍ Iy ½øÐÐÃèÊö¡£
ͼÏñµÄÌݶÈÏòÁ¿Îª¨ŒI = [Ix, Iy]T¡£ÌݶÈÓÐÁ½¸öÖØÒªµÄÊôÐÔ£¬Ò»ÊÇÌݶȵĴóС£º

ËüÃèÊöÁËͼÏñÇ¿¶È±ä»¯µÄÇ¿Èõ£¬Ò»ÊÇÌݶȵĽǶȣº
¦Á=arctan2(Iy, Ix)
ÃèÊöÁËͼÏñÖÐÔÚÿ¸öµã£¨ÏñËØ£©ÉÏÇ¿¶È±ä»¯×î´óµÄ·½Ïò¡£NumPy ÖÐµÄ arctan2() º¯Êý·µ»Ø»¡¶È±íʾµÄÓзûºÅ½Ç¶È£¬½Ç¶ÈµÄ±ä»¯Çø¼äΪ
-¦Ð...¦Ð¡£
ÎÒÃÇ¿ÉÒÔÓÃÀëÉ¢½üËÆµÄ·½Ê½À´¼ÆËãͼÏñµÄµ¼Êý¡£Í¼Ïñµ¼Êý´ó¶àÊý¿ÉÒÔͨ¹ý¾í»ý¼òµ¥µØÊµÏÖ£º

¶ÔÓÚ Dx ºÍ Dy£¬Í¨³£Ñ¡Ôñ Prewitt Â˲¨Æ÷£º

»òÕß Sobel Â˲¨Æ÷£º

ÕâЩµ¼ÊýÂ˲¨Æ÷¿ÉÒÔʹÓà scipy.ndimage.filters
Ä£¿éµÄ±ê×¼¾í»ý²Ù×÷À´¼òµ¥µØÊµÏÖ£¬ÀýÈ磺
from PIL import Image
from numpy import *
from scipy.ndimage import filters
im = array(Image.open('empire.jpg').convert('L'))
# Sobel µ¼ÊýÂ˲¨Æ÷
imx = zeros(im.shape)
filters.sobel(im,1,imx)
imy = zeros(im.shape)
filters.sobel(im,0,imy)
magnitude = sqrt(imx**2+imy**2) |
ÉÏÃæµÄ½Å±¾Ê¹Óà Sobel Â˲¨Æ÷À´¼ÆËã x ºÍ y µÄ·½Ïòµ¼Êý£¬ÒÔ¼°ÌݶȴóС¡£sobel() º¯ÊýµÄµÚ¶þ¸ö²ÎÊý±íʾѡÔñ
x »òÕß y ·½Ïòµ¼Êý£¬µÚÈý¸ö²ÎÊý±£´æÊä³öµÄ±äÁ¿¡£Í¼ 1-10 ÏÔʾÁËÓà Sobel Â˲¨Æ÷¼ÆËã³öµÄµ¼ÊýͼÏñ¡£ÔÚÁ½¸öµ¼ÊýͼÏñÖУ¬Õýµ¼ÊýÏÔʾΪÁÁµÄÏñËØ£¬¸ºµ¼ÊýÏÔʾΪ°µµÄÏñËØ¡£»ÒÉ«ÇøÓò±íʾµ¼ÊýµÄÖµ½Ó½üÓÚÁã¡£

ͼ 1-10£ºÊ¹Óà Sobel µ¼ÊýÂ˲¨Æ÷¼ÆËãµ¼ÊýͼÏñ£º£¨a£©Ôʼ»Ò¶ÈͼÏñ£»£¨b£©x µ¼ÊýͼÏñ£»£¨c£©y
µ¼ÊýͼÏñ£»£¨d£©ÌݶȴóСͼÏñ
ÉÏÊö¼ÆËãͼÏñµ¼ÊýµÄ·½·¨ÓÐһЩȱÏÝ£ºÔڸ÷½·¨ÖУ¬Â˲¨Æ÷µÄ³ß¶ÈÐèÒªËæ×ÅͼÏñ·Ö±æÂʵı仯¶ø±ä»¯¡£ÎªÁËÔÚͼÏñÔëÉù·½Ãæ¸üÎȽ¡£¬ÒÔ¼°ÔÚÈÎÒâ³ß¶ÈÉϼÆËãµ¼Êý£¬ÎÒÃÇ¿ÉÒÔʹÓøß˹µ¼ÊýÂ˲¨Æ÷£º

ÆäÖУ¬G¦ÒxºÍ G¦Òy ±íʾ G¦Ò ÔÚ x ºÍ y ·½ÏòÉϵĵ¼Êý£¬G¦Ò Ϊ±ê×¼²îΪ ¦Ò µÄ¸ß˹º¯Êý¡£
ÎÒÃÇ֮ǰÓÃÓÚÄ£ºýµÄ filters.gaussian_filter()
º¯Êý¿ÉÒÔ½ÓÊܶîÍâµÄ²ÎÊý£¬ÓÃÀ´¼ÆËã¸ß˹µ¼Êý¡£¿ÉÒÔ¼òµ¥µØ°´ÕÕÏÂÃæµÄ·½Ê½À´´¦Àí£º
sigma = 5 # ±ê×¼²î
imx = zeros(im.shape)
filters.gaussian_filter(im, (sigma,sigma), (0,1),
imx)
imy = zeros(im.shape)
filters.gaussian_filter(im, (sigma,sigma), (1,0),
imy) |
¸Ãº¯ÊýµÄµÚÈý¸ö²ÎÊýÖ¸¶¨¶Ôÿ¸ö·½Ïò¼ÆËãÄÄÖÖÀàÐ͵ĵ¼Êý£¬µÚ¶þ¸ö²ÎÊýΪʹÓõıê×¼²î¡£Äã¿ÉÒԲ鿴ÏàÓ¦ÎĵµÁ˽âÏêÇ顣ͼ
1-11 ÏÔʾÁ˲»Í¬³ß¶Èϵĵ¼ÊýͼÏñºÍÌݶȴóС¡£Äã¿ÉÒÔºÍͼ 1-9 ÖÐ×öÏàͬ³ß¶ÈÄ£ºýµÄͼÏñ×ö±È½Ï¡£

ͼ 1-11£ºÊ¹Óøß˹µ¼Êý¼ÆËãͼÏñµ¼Êý£ºx µ¼ÊýͼÏñ£¨ÉÏ£©£¬y µ¼ÊýͼÏñ£¨ÖУ©£¬ÒÔ¼°ÌݶȴóСͼÏñ£¨Ï£©£»£¨a£©ÎªÔʼ»Ò¶ÈͼÏñ£¬£¨b£©ÎªÊ¹ÓÃ
¦Ò=2 µÄ¸ß˹µ¼ÊýÂ˲¨Æ÷´¦ÀíºóµÄͼÏñ£¬£¨c£©ÎªÊ¹ Óà ¦Ò=5 µÄ¸ß˹µ¼ÊýÂ˲¨Æ÷´¦ÀíºóµÄͼÏñ£¬£¨d£©ÎªÊ¹ÓÃ
¦Ò=10 µÄ¸ß˹µ¼ÊýÂ˲¨Æ÷´¦ÀíºóµÄͼÏñ
1.4.3¡¡ÐÎ̬ѧ£º¶ÔÏó¼ÆÊý
ÐÎ̬ѧ£¨»òÊýѧÐÎ̬ѧ£©ÊǶÈÁ¿ºÍ·ÖÎö»ù±¾ÐÎ×´µÄͼÏñ´¦Àí·½·¨µÄ»ù±¾¿ò¼ÜÓ뼯ºÏ¡£ÐÎ̬ѧͨ³£ÓÃÓÚ´¦Àí¶þֵͼÏñ£¬µ«ÊÇÒ²Äܹ»ÓÃÓÚ»Ò¶ÈͼÏñ¡£¶þֵͼÏñÊÇָͼÏñµÄÿ¸öÏñËØÖ»ÄÜÈ¡Á½¸öÖµ£¬Í¨³£ÊÇ
0 ºÍ 1¡£¶þֵͼÏñͨ³£ÊÇ£¬ÔÚ¼ÆËãÎïÌåµÄÊýÄ¿£¬»òÕß¶ÈÁ¿Æä´óСʱ£¬¶ÔÒ»·ùͼÏñ½øÐÐãÐÖµ»¯ºóµÄ½á¹û¡£Äã¿ÉÒÔ´Ó
´óÌåÁ˽âÐÎ̬ѧ¼°Æä´¦ÀíͼÏñµÄ·½Ê½¡£
scipy.ndimage ÖÐµÄ morphology Ä£¿é¿ÉÒÔʵÏÖÐÎ̬ѧ²Ù×÷¡£Äã¿ÉÒÔʹÓà scipy.ndimage
ÖÐµÄ measurements Ä£¿éÀ´ÊµÏÖ¶þֵͼÏñµÄ¼ÆÊýºÍ¶ÈÁ¿¹¦ÄÜ¡£ÏÂÃæÍ¨¹ýÒ»¸ö¼òµ¥µÄÀý×Ó½éÉÜÈçºÎʹÓÃËüÃÇ¡£
¿¼ÂÇÔÚͼ 1-12a3 ÀïµÄ¶þֵͼÏñ£¬¼ÆËã¸ÃͼÏñÖеĶÔÏó¸öÊý¿ÉÒÔͨ¹ýÏÂÃæµÄ½Å±¾ÊµÏÖ£º
3Õâ¸öͼÏñʵ¼ÊÉÏÊÇͼÏñ¡°·Ö¸î¡±ºóµÄ½á¹û¡£Èç¹ûÄãÏëÖªµÀ¸ÃͼÏñÊÇÈçºÎ´´½¨µÄ£¬¿ÉÒԲ鿴
9.3 ½Ú¡£
from scipy.ndimage import measurements,morphology
# ÔØÈëͼÏñ£¬È»ºóʹÓÃãÐÖµ»¯²Ù×÷£¬ÒÔ±£Ö¤´¦ÀíµÄͼÏñΪ¶þֵͼÏñ
im = array(Image.open('houses.png').convert('L'))
im = 1*(im<128)
labels, nbr_objects = measurements.label(im)
print "Number of objects:", nbr_objects |
ÉÏÃæµÄ½Å±¾Ê×ÏÈÔØÈë¸ÃͼÏñ£¬Í¨¹ýãÐÖµ»¯·½Ê½À´È·±£¸ÃͼÏñÊǶþֵͼÏñ¡£Í¨¹ýºÍ
1 Ïà³Ë£¬½Å±¾½«²¼¶ûÊý×éת»»³É¶þ½øÖƱíʾ¡£È»ºó£¬ÎÒÃÇʹÓà label() º¯ÊýѰÕÒµ¥¸öµÄÎïÌ壬²¢ÇÒ°´ÕÕËüÃÇÊôÓÚÄĸö¶ÔÏó½«ÕûÊý±êÇ©¸øÏñËØ¸³Öµ¡£Í¼
1-12b ÊÇlabels Êý×éµÄͼÏñ¡£Í¼ÏñµÄ»Ò¶ÈÖµ±íʾ¶ÔÏóµÄ±êÇ©¡£¿ÉÒÔ¿´µ½£¬ÔÚһЩ¶ÔÏóÖ®¼äÓÐһЩСµÄÁ¬½Ó¡£½øÐжþ½øÖÆ¿ª£¨binary
open£©²Ù×÷£¬ÎÒÃÇ¿ÉÒÔ½«ÆäÒÆ³ý£º
# ÐÎ̬ѧ¿ª²Ù×÷¸üºÃµØ·ÖÀë¸÷¸ö¶ÔÏó
im_open = morphology.binary_opening(im,ones((9,5)),iterations=2)
labels_open, nbr_objects_open = measurements.label(im_open)
print "Number of objects:", nbr_objects_open
|
binary_opening() º¯ÊýµÄµÚ¶þ¸ö²ÎÊýÖ¸¶¨Ò»¸öÊý×é½á¹¹ÔªËØ¡£¸ÃÊý×é±íʾÒÔÒ»¸öÏñËØÎªÖÐÐÄʱ£¬Ê¹ÓÃÄÄЩÏàÁÚÏñËØ¡£ÔÚÕâÖÖÇé¿öÏ£¬ÎÒÃÇÔÚ
y ·½ÏòÉÏʹÓà 9 ¸öÏñËØ£¨ÉÏÃæ 4 ¸öÏñËØ¡¢ÏñËØ±¾Éí¡¢ÏÂÃæ 4 ¸öÏñËØ£©£¬ÔÚ x ·½ÏòÉÏʹÓà 5
¸öÏñËØ¡£Äã¿ÉÒÔÖ¸¶¨ÈÎÒâÊý×éΪ½á¹¹ÔªËØ£¬Êý×éÖеķÇÁãÔªËØ¾ö¶¨Ê¹ÓÃÄÄЩÏàÁÚÏñËØ¡£²ÎÊý iterations
¾ö¶¨Ö´ÐиòÙ×÷µÄ´ÎÊý¡£Äã¿ÉÒÔ³¢ÊÔʹÓò»Í¬µÄµü´ú´ÎÊý iterations Öµ£¬¿´Ò»Ï¶ÔÏóµÄÊýÄ¿ÈçºÎ±ä»¯¡£Äã¿ÉÒÔÔÚͼ
1-12c Óëͼ 1-12d Öв鿴¾¹ý¿ª²Ù×÷ºóµÄͼÏñ£¬ÒÔ¼°ÏàÓ¦µÄ±êǩͼÏñ¡£ÕýÈçÄãÏëÏóµÄÒ»Ñù£¬binary_closing()
º¯ÊýʵÏÖÏà·´µÄ²Ù×÷¡£ÎÒÃǽ«¸Ãº¯ÊýºÍÔÚmorphology ºÍ measurements Ä£¿éÖÐµÄÆäËûº¯ÊýµÄÓ÷¨Áô×÷Á·Ï°¡£Äã¿ÉÒÔ´Ó
scipy.ndimage Ä£¿éÎĵµ
ÖÐÁË½â¹ØÓÚÕâЩº¯ÊýµÄ¸ü¶à֪ʶ¡£

ͼ 1-12£ºÐÎ̬ѧʾÀý¡£Ê¹ÓöþÖµ¿ª²Ù×÷½«¶ÔÏó·Ö¿ª£¬È»ºó¼ÆËãÎïÌåµÄÊýÄ¿£º£¨a£©ÎªÔʼ¶þֵͼÏñ£»£¨b£©Îª¶ÔÓ¦ÔʼͼÏñµÄ±êǩͼÏñ£¬ÆäÖлҶÈÖµ±íʾÎïÌåµÄ±êÇ©£»£¨c£©ÎªÊ¹Óÿª²Ù×÷ºóµÄ¶þֵͼÏñ£»£¨d£©Îª¿ª²Ù×÷ºóͼÏñµÄ±êǩͼÏñ
1.4.4¡¡Ò»Ð©ÓÐÓõÄSciPyÄ£¿é
SciPy Öаüº¬Ò»Ð©ÓÃÓÚÊäÈëºÍÊä³öµÄʵÓÃÄ£¿é¡£ÏÂÃæ½éÉÜÆäÖÐÁ½¸öÄ£¿é£ºio ºÍ misc¡£
¶Áд.matÎļþ
Èç¹ûÄãÓÐһЩÊý¾Ý£¬»òÕßÔÚÍøÉÏÏÂÔØµ½Ò»Ð©ÓÐȤµÄÊý¾Ý¼¯£¬ÕâЩÊý¾ÝÒÔ Matlab
µÄ .mat Îļþ¸ñʽ´æ´¢£¬ÄÇô¿ÉÒÔʹÓà scipy.io Ä£¿é½øÐжÁÈ¡¡£
data = scipy.io.loadmat('test.mat') |
ÉÏÃæ´úÂëÖУ¬data ¶ÔÏó°üº¬Ò»¸ö×ֵ䣬×ÖµäÖеļü¶ÔÓ¦ÓÚ±£´æÔÚÔʼ
.mat ÎļþÖеıäÁ¿Ãû¡£ÓÉÓÚÕâЩ±äÁ¿ÊÇÊý×é¸ñʽµÄ£¬Òò´Ë¿ÉÒԺܷ½±ãµØ±£´æµ½ .mat ÎļþÖС£Äã½öÐè´´½¨Ò»¸ö×ֵ䣨ÆäÖÐÒª°üº¬ÄãÏëÒª±£´æµÄËùÓбäÁ¿£©£¬È»ºóʹÓÃ
savemat() º¯Êý£º
data = {}
data['x'] = x
scipy.io.savemat('test.mat',data) |
ÒòΪÉÏÃæµÄ½Å±¾±£´æµÄÊÇÊý×é x£¬ËùÒÔµ±¶ÁÈëµ½ Matlab ÖÐʱ£¬±äÁ¿µÄÃû×ÖÈÔΪ x¡£¹ØÓÚ scipy.io
Ä£¿éµÄ¸ü¶àÄÚÈÝ£¬Çë²Î¼ûÔÚÏßÎĵµ ¡£
ÒÔͼÏñÐÎʽ±£´æÊý×é
ÒòΪÎÒÃÇÐèÒª¶ÔͼÏñ½øÐвÙ×÷£¬²¢ÇÒÐèҪʹÓÃÊý×é¶ÔÏóÀ´×öÔËË㣬ËùÒÔ½«Êý×éÖ±½Ó±£´æÎªÍ¼ÏñÎļþ 4 ·Ç³£ÓÐÓᣱ¾ÊéÖеĺܶàͼÏñ¶¼ÊÇÕâÑùµÄ´´½¨µÄ¡£
imsave() º¯Êý¿ÉÒÔ´Ó scipy.misc Ä£¿éÖÐÔØÈë¡£Òª½«Êý×é
im ±£´æµ½ÎļþÖУ¬¿ÉÒÔʹÓÃÏÂÃæµÄÃüÁ
from scipy.misc import imsave
imsave('test.jpg',im) |
scipy.misc Ä£¿éͬÑù°üº¬ÁËÖøÃûµÄ Lena ²âÊÔͼÏñ£º
¸Ã½Å±¾·µ»ØÒ»¸ö 512¡Á512 µÄ»Ò¶ÈͼÏñÊý×é¡£
4ËùÓÐ Pylab ͼ¾ù¿É±£´æÎª¶àÖÖͼÏñ¸ñʽ£¬·½·¨Êǵã»÷ͼÏñ´°¿ÚÖеġ°±£´æ¡±°´Å¥¡£
1.5¡¡¸ß¼¶Ê¾Àý£ºÍ¼ÏñÈ¥Ôë
ÎÒÃÇͨ¹ýÒ»¸ö·Ç³£ÊµÓõÄÀý×Ó¡ª¡ªÍ¼ÏñµÄÈ¥Ô롪¡ªÀ´½áÊø±¾Õ¡£Í¼ÏñÈ¥ÔëÊÇÔÚÈ¥³ýͼÏñÔëÉùµÄͬʱ£¬¾¡¿ÉÄܵر£ÁôͼÏñϸ½ÚºÍ½á¹¹µÄ´¦Àí¼¼Êõ¡£ÎÒÃÇÕâÀïʹÓÃ
ROF£¨Rudin-Osher-Fatemi£©È¥ÔëÄ£ÐÍ¡£¸ÃÄ£ÐÍ×îÔç³öÏÖÔÚÎÄÏ× [28] ÖС£Í¼ÏñÈ¥Ôë¶ÔÓںܶàÓ¦ÓÃÀ´Ëµ¶¼·Ç³£ÖØÒª£»ÕâЩӦÓ÷¶Î§ºÜ¹ã£¬Ð¡µ½ÈÃÄãµÄ¼ÙÆÚÕÕÆ¬¿´ÆðÀ´¸üƯÁÁ£¬´óµ½Ìá¸ßÎÀÐÇͼÏñµÄÖÊÁ¿¡£ROF
Ä£Ð;ßÓкܺõÄÐÔÖÊ£ºÊ¹´¦ÀíºóµÄͼÏñ¸üƽ»¬£¬Í¬Ê±±£³ÖͼÏñ±ßÔµºÍ½á¹¹ÐÅÏ¢¡£
ROF Ä£Ð͵ÄÊýѧ»ù´¡ºÍ´¦Àí¼¼Çɷdz£¸ßÉ²»ÔÚ±¾Êé½²Êö·¶Î§Ö®ÄÚ¡£ÔÚ½²ÊöÈçºÎ»ùÓÚ Chambolle
Ìá³öµÄËã·¨ [5] ʵÏÖ ROF Çó½âÆ÷֮ǰ£¬±¾ÊéÊ×ÏȼòÒª½éÉÜһϠROF Ä£ÐÍ¡£
Ò»·ù£¨»Ò¶È£©Í¼Ïñ I µÄÈ«±ä²î£¨Total Variation£¬TV£©¶¨ÒåΪÌݶȷ¶ÊýÖ®ºÍ¡£ÔÚÁ¬Ðø±íʾµÄÇé¿öÏ£¬È«±ä²î±íʾΪ£º
£¨1.1£©
ÔÚÀëÉ¢±íʾµÄÇé¿öÏ£¬È«±ä²î±íʾΪ£º
ÆäÖУ¬ÉÏÃæµÄʽ×ÓÊÇÔÚËùÓÐͼÏñ×ø±ê x=[x, y] ÉÏÈ¡ºÍ¡£
ÔÚ Chambolle Ìá³öµÄ ROF Ä£ÐÍÀĿ±êº¯ÊýΪѰÕÒ½µÔëºóµÄͼÏñ U£¬Ê¹ÏÂʽ×îС£º
ÆäÖз¶Êý ||I-U|| ÊÇÈ¥ÔëºóͼÏñ U ºÍÔʼͼÏñ I ²îÒìµÄ¶ÈÁ¿¡£Ò²¾ÍÊÇ˵£¬±¾ÖÊÉϸÃÄ£ÐÍʹȥÔëºóµÄͼÏñÏñËØÖµ¡°Æ½Ì¹¡±±ä»¯£¬µ«ÊÇÔÚͼÏñÇøÓòµÄ±ßÔµÉÏ£¬ÔÊÐíÈ¥ÔëºóµÄͼÏñÏñËØÖµ¡°ÌøÔ¾¡±±ä»¯¡£
°´ÕÕÂÛÎÄ [5] ÖеÄËã·¨£¬ÎÒÃÇ¿ÉÒÔ°´ÕÕÏÂÃæµÄ´úÂëʵÏÖ ROF Ä£ÐÍÈ¥Ô룺
from numpy import
*
def denoise(im,U_init,tolerance=0.1,tau=0.125,tv_weight=100):
""" ʹÓÃA. Chambolle£¨2005£©ÔÚ¹«Ê½£¨11£©ÖеļÆËã²½ÖèʵÏÖRudin-Osher-Fatemi£¨ROF£©È¥ÔëÄ£ÐÍ
ÊäÈ룺º¬ÓÐÔëÉùµÄÊäÈëͼÏñ£¨»Ò¶ÈͼÏñ£©¡¢U µÄ³õʼֵ¡¢TV ÕýÔòÏîȨֵ¡¢²½³¤¡¢Í£ÒµÌõ¼þ
Êä³ö£ºÈ¥ÔëºÍÈ¥³ýÎÆÀíºóµÄͼÏñ¡¢ÎÆÀí²ÐÁô"""
m,n = im.shape # ÔëÉùͼÏñµÄ´óС
# ³õʼ»¯
U = U_init
Px = im # ¶ÔżÓòµÄx ·ÖÁ¿
Py = im # ¶ÔżÓòµÄy ·ÖÁ¿
error = 1
while (error > tolerance):
Uold = U
# Ôʼ±äÁ¿µÄÌݶÈ
GradUx = roll(U,-1,axis=1)-U # ±äÁ¿U ÌݶȵÄx ·ÖÁ¿
GradUy = roll(U,-1,axis=0)-U # ±äÁ¿U ÌݶȵÄy ·ÖÁ¿
# ¸üÐ¶Ôż±äÁ¿
PxNew = Px + (tau/tv_weight)*GradUx
PyNew = Py + (tau/tv_weight)*GradUy
NormNew = maximum(1,sqrt(PxNew**2+PyNew**2))
Px = PxNew/NormNew # ¸üÐÂx ·ÖÁ¿£¨¶Ôż£©
Py = PyNew/NormNew # ¸üÐÂy ·ÖÁ¿£¨¶Ôż£©
# ¸üÐÂÔʼ±äÁ¿
RxPx = roll(Px,1,axis=1) # ¶Ôx ·ÖÁ¿½øÐÐÏòÓÒx ÖáÆ½ÒÆ
RyPy = roll(Py,1,axis=0) # ¶Ôy ·ÖÁ¿½øÐÐÏòÓÒy ÖáÆ½ÒÆ
DivP = (Px-RxPx)+(Py-RyPy) # ¶ÔżÓòµÄÉ¢¶È
U = im + tv_weight*DivP # ¸üÐÂÔʼ±äÁ¿
# ¸üÐÂÎó²î
error = linalg.norm(U-Uold)/sqrt(n*m);
return U, |
|