SciPy - Ndimage
โมดูลย่อย SciPy ndimage มีไว้สำหรับการประมวลผลภาพ ในที่นี้ ndimage หมายถึงภาพ n มิติ
งานที่พบบ่อยที่สุดในการประมวลผลภาพมีดังนี้ & miuns;
- อินพุต / เอาท์พุตแสดงภาพ
- การปรับแต่งพื้นฐาน - การครอบตัดการพลิกการหมุน ฯลฯ
- การกรองภาพ - การลดเสียงการเพิ่มความคมชัด ฯลฯ
- การแบ่งส่วนภาพ - พิกเซลการติดฉลากที่สอดคล้องกับวัตถุต่างๆ
- Classification
- การแยกคุณลักษณะ
- Registration
ให้เราพูดถึงวิธีการบางอย่างที่สามารถทำได้โดยใช้ SciPy
การเปิดและการเขียนลงในไฟล์รูปภาพ
misc packageใน SciPy มาพร้อมกับภาพบางภาพ เราใช้ภาพเหล่านั้นเพื่อเรียนรู้การปรับแต่งภาพ ขอให้เราพิจารณาตัวอย่างต่อไปนี้.
from scipy import misc
f = misc.face()
misc.imsave('face.png', f) # uses the Image module (PIL)
import matplotlib.pyplot as plt
plt.imshow(f)
plt.show()
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
รูปภาพใด ๆ ในรูปแบบดิบคือการรวมกันของสีที่แสดงด้วยตัวเลขในรูปแบบเมทริกซ์ เครื่องเข้าใจและจัดการกับภาพตามตัวเลขเหล่านั้นเท่านั้น RGB เป็นวิธีการแสดงที่ได้รับความนิยม
ให้เราดูข้อมูลทางสถิติของภาพด้านบน
from scipy import misc
face = misc.face(gray = False)
print face.mean(), face.max(), face.min()
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
110.16274388631184, 255, 0
ตอนนี้เรารู้แล้วว่าภาพนั้นสร้างขึ้นจากตัวเลขดังนั้นการเปลี่ยนแปลงค่าของตัวเลขจะเปลี่ยนภาพต้นฉบับ ให้เราทำการแปลงรูปทรงเรขาคณิตบนภาพ การดำเนินการทางเรขาคณิตพื้นฐานคือการครอบตัด
from scipy import misc
face = misc.face(gray = True)
lx, ly = face.shape
# Cropping
crop_face = face[lx / 4: - lx / 4, ly / 4: - ly / 4]
import matplotlib.pyplot as plt
plt.imshow(crop_face)
plt.show()
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
นอกจากนี้เรายังสามารถดำเนินการขั้นพื้นฐานบางอย่างเช่นการพลิกภาพกลับหัวตามที่อธิบายไว้ด้านล่าง
# up <-> down flip
from scipy import misc
face = misc.face()
flip_ud_face = np.flipud(face)
import matplotlib.pyplot as plt
plt.imshow(flip_ud_face)
plt.show()
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
นอกจากนี้เรายังมีไฟล์ rotate() functionซึ่งจะหมุนภาพตามมุมที่กำหนด
# rotation
from scipy import misc,ndimage
face = misc.face()
rotate_face = ndimage.rotate(face, 45)
import matplotlib.pyplot as plt
plt.imshow(rotate_face)
plt.show()
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
ฟิลเตอร์
ให้เราคุยกันว่าฟิลเตอร์ช่วยในการประมวลผลภาพอย่างไร
การกรองในการประมวลผลภาพคืออะไร?
การกรองเป็นเทคนิคในการปรับเปลี่ยนหรือปรับปรุงรูปภาพ ตัวอย่างเช่นคุณสามารถกรองรูปภาพเพื่อเน้นคุณสมบัติบางอย่างหรือลบคุณสมบัติอื่น ๆ การประมวลผลภาพที่ใช้กับการกรอง ได้แก่ Smoothing, Sharpening และ Edge Enhancement
การกรองเป็นการดำเนินการในพื้นที่ใกล้เคียงซึ่งค่าของพิกเซลที่กำหนดในภาพที่ส่งออกจะถูกกำหนดโดยใช้อัลกอริทึมบางอย่างกับค่าของพิกเซลในพื้นที่ใกล้เคียงของพิกเซลอินพุตที่เกี่ยวข้อง ตอนนี้ให้เราดำเนินการบางอย่างโดยใช้ SciPy ndimage
เบลอ
การเบลอภาพใช้กันอย่างแพร่หลายเพื่อลดจุดรบกวนในภาพ เราสามารถดำเนินการกรองและดูการเปลี่ยนแปลงในภาพ ขอให้เราพิจารณาตัวอย่างต่อไปนี้.
from scipy import misc
face = misc.face()
blurred_face = ndimage.gaussian_filter(face, sigma=3)
import matplotlib.pyplot as plt
plt.imshow(blurred_face)
plt.show()
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
ค่าซิกม่าบ่งบอกระดับความเบลอในระดับห้า เราสามารถเห็นการเปลี่ยนแปลงคุณภาพของภาพได้โดยการปรับค่าซิกม่า สำหรับรายละเอียดเพิ่มเติมของการเบลอให้คลิกที่→สอน DIP (Digital Image Processing)
การตรวจจับขอบ
ให้เราคุยกันว่าการตรวจจับขอบช่วยในการประมวลผลภาพอย่างไร
Edge Detection คืออะไร?
การตรวจจับขอบเป็นเทคนิคการประมวลผลภาพสำหรับการค้นหาขอบเขตของวัตถุภายในภาพ ทำงานโดยตรวจจับความไม่ต่อเนื่องของความสว่าง การตรวจจับขอบใช้สำหรับการแบ่งส่วนภาพและการแยกข้อมูลในพื้นที่ต่างๆเช่นการประมวลผลภาพคอมพิวเตอร์วิชั่นและวิชันซิสเต็ม
อัลกอริทึมการตรวจจับขอบที่ใช้บ่อยที่สุด ได้แก่
- Sobel
- Canny
- Prewitt
- Roberts
- วิธีฟัซซี่ลอจิก
ขอให้เราพิจารณาตัวอย่างต่อไปนี้.
import scipy.ndimage as nd
import numpy as np
im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = ndimage.gaussian_filter(im, 8)
import matplotlib.pyplot as plt
plt.imshow(im)
plt.show()
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้
ภาพมีลักษณะเป็นบล็อกสีเหลี่ยม ตอนนี้เราจะตรวจจับขอบของบล็อกสีเหล่านั้น ที่นี่ ndimage มีฟังก์ชันที่เรียกว่าSobelเพื่อดำเนินการนี้ ในขณะที่ NumPy ให้ไฟล์Hypot ฟังก์ชันเพื่อรวมเมทริกซ์ผลลัพธ์ทั้งสองเข้าด้วยกัน
ขอให้เราพิจารณาตัวอย่างต่อไปนี้.
import scipy.ndimage as nd
import matplotlib.pyplot as plt
im = np.zeros((256, 256))
im[64:-64, 64:-64] = 1
im[90:-90,90:-90] = 2
im = ndimage.gaussian_filter(im, 8)
sx = ndimage.sobel(im, axis = 0, mode = 'constant')
sy = ndimage.sobel(im, axis = 1, mode = 'constant')
sob = np.hypot(sx, sy)
plt.imshow(sob)
plt.show()
โปรแกรมข้างต้นจะสร้างผลลัพธ์ต่อไปนี้