💢💢قبل از ادامه بحث Otsu
مطالب زیر را مرور کنید:
مطالب زیر را مرور کنید:
https://commons.wikimedia.org/wiki/File:BhaProgress3.gif?uselang=fa#/media/File:BhaProgress3.gif
💢✅آستانهگذاری یکی از مناسبترین روشها برای بخشبندی تصویر میباشد.
با اعمال یک روش آستانهگذاری بر روی یک تصویر مقیاس خاکستری، تصویری باینری بدست میآید که مرز اشیاء حاضر در تصویر با دقت مناسبی مشخص میگردد.
با استفاده از بخشبندی تصویر، مثلا تعداد مربع یا مستطیل را در تصویر میتوانیم بشماریم. یا تشخیص چهره و اثر انگشت و ...
در این قسمت از کاربرد پردازش تصویر میگنجد.
💢✅آستانهگذاری یکی از مناسبترین روشها برای بخشبندی تصویر میباشد.
با اعمال یک روش آستانهگذاری بر روی یک تصویر مقیاس خاکستری، تصویری باینری بدست میآید که مرز اشیاء حاضر در تصویر با دقت مناسبی مشخص میگردد.
با استفاده از بخشبندی تصویر، مثلا تعداد مربع یا مستطیل را در تصویر میتوانیم بشماریم. یا تشخیص چهره و اثر انگشت و ...
در این قسمت از کاربرد پردازش تصویر میگنجد.
commons.wikimedia.org
File:BhaProgress3.gif - Wikimedia Commons
✅💢روش آستانه گذاری Otsu ، تصویر را به گونه ای تقسیم بندی میکند که تصویر با بهترین مقدار آستانه به دو کلاس سیاه و سفید یا پیش زمینه و پس زمینه یا پس زمینه و شی تقسیم میشود:
✅💢در یک تصویر bimodal (تصویری که هیستوگرام آن دارای دو قله میباشد)، تقریبا در وسط قله ها میتوان آستانه بهینه را انتخاب کرد.
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('bimodal_hsv_noise.png',0)
# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# plot all the images and their histograms
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('bimodal_hsv_noise.png',0)
# global thresholding
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# Otsu's thresholding
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# Otsu's thresholding after Gaussian filtering
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
# plot all the images and their histograms
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show()
python_developer
σ2w(t)=q1(t)σ21(t)+q2(t)σ22(t) where q1(t)=∑i=1tP(i)&q1(t)=∑i=t+1IP(i) μ1(t)=∑i=1tiP(i)q1(t)&μ2(t)=∑i=t+1IiP(i)q2(t) σ21(t)=∑i=1t[i−μ1(t)]2P(i)q1(t)&σ22(t)=∑i=t+1I[i−μ1(t)]2P(i)q2(t)
این تصویر یک bimodal_hsv نویز دار است. برای همین ما از تابع cv2.threshold() استفاده میکنیم ولی یک فلگ اضافی ، cv2.THRESH_OTSU را داریم . این روش مقدار بهینه آستانه را در retVal قرار میدهد و مقدار threshold برابر 0 میشود. همچنین با فیلترینگ نویز را برطرف شده است .
This media is not supported in your browser
VIEW IN TELEGRAM
✅ در #قطعه_بندی تقسیم تصاوبر به نواحی غیر یکسان میباشد، طوری که با هم اشتراکی نداشته باشند.
python_developer
σ2w(t)=q1(t)σ21(t)+q2(t)σ22(t) where q1(t)=∑i=1tP(i)&q1(t)=∑i=t+1IP(i) μ1(t)=∑i=1tiP(i)q1(t)&μ2(t)=∑i=t+1IiP(i)q2(t) σ21(t)=∑i=1t[i−μ1(t)]2P(i)q1(t)&σ22(t)=∑i=t+1I[i−μ1(t)]2P(i)q2(t)
آستانه گذاری #دوسطحی یک مقدار آستانه دارد و پیکسلهای تصویر به دو گروه یا کلاس تقسیم میشوند. انتخاب آستانه در این گروه تصاویر بسیار ساده از آستانه گذاری چند سطحی میباشد.
💢💢💢💢💢💢💢💢💢💢
✅اگر تصوير به خوبي دو سطحي نشود ، اطلاعات زيادي از بين خواهد رفت.
یعنی تصویر خاکستری(Scale-Gray)
(تصویر 8 بیتی یا 1 بایتی ، هر پپکسل مقداری بین 0-255 میگیرد. )به دو دویی( تصویر 1بیتی ، در هر پیکسل 1یا0 ذخیره میشود. در واقع همان سفید مطلق و سیاه مطلق ) تبدیل شود.
✅اگر تصوير به خوبي دو سطحي نشود ، اطلاعات زيادي از بين خواهد رفت.
یعنی تصویر خاکستری(Scale-Gray)
(تصویر 8 بیتی یا 1 بایتی ، هر پپکسل مقداری بین 0-255 میگیرد. )به دو دویی( تصویر 1بیتی ، در هر پیکسل 1یا0 ذخیره میشود. در واقع همان سفید مطلق و سیاه مطلق ) تبدیل شود.
python_developer
آستانه گیری چند سطحی با دو آستانه
import cv2
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('photo_2017-10-07_16-19-40.jpg',0)
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show
import numpy as np
from matplotlib import pyplot as plt
img = cv2.imread('photo_2017-10-07_16-19-40.jpg',0)
ret1,th1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
ret2,th2 = cv2.threshold(img,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
blur = cv2.GaussianBlur(img,(5,5),0)
ret3,th3 = cv2.threshold(blur,0,255,cv2.THRESH_BINARY+cv2.THRESH_OTSU)
images = [img, 0, th1,
img, 0, th2,
blur, 0, th3]
titles = ['Original Noisy Image','Histogram','Global Thresholding (v=127)',
'Original Noisy Image','Histogram',"Otsu's Thresholding",
'Gaussian filtered Image','Histogram',"Otsu's Thresholding"]
for i in xrange(3):
plt.subplot(3,3,i*3+1),plt.imshow(images[i*3],'gray')
plt.title(titles[i*3]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+2),plt.hist(images[i*3].ravel(),256)
plt.title(titles[i*3+1]), plt.xticks([]), plt.yticks([])
plt.subplot(3,3,i*3+3),plt.imshow(images[i*3+2],'gray')
plt.title(titles[i*3+2]), plt.xticks([]), plt.yticks([])
plt.show