<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Pavat</title>
    <description>The latest articles on DEV Community by Pavat (@pavat).</description>
    <link>https://dev.to/pavat</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F1418528%2Fe84fc6e6-e936-43b9-997c-d9bd444545d1.jpeg</url>
      <title>DEV Community: Pavat</title>
      <link>https://dev.to/pavat</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/pavat"/>
    <language>en</language>
    <item>
      <title>Digital Image Processing ผ่านการคำนวณฮิสโตแกรมและการปรับสมดุล</title>
      <dc:creator>Pavat</dc:creator>
      <pubDate>Sat, 13 Apr 2024 11:47:11 +0000</pubDate>
      <link>https://dev.to/pavat/kaarpramwlphlphaaphdicchithal-phaankaarkhamnwnhisotaekrmaelakaarprabsmdul-4g70</link>
      <guid>https://dev.to/pavat/kaarpramwlphlphaaphdicchithal-phaankaarkhamnwnhisotaekrmaelakaarprabsmdul-4g70</guid>
      <description>&lt;p&gt;&lt;strong&gt;ฮิสโตแกรม คืออะไร ?&lt;/strong&gt;&lt;br&gt;
ฮิสโตแกรมจะแสดงถึงระดับความเข้มของแต่ละสีในภาพ ทำให้การคำนวณฮิสโตแกรมนั้น จะช่วยให้เราสร้างเกณฑ์ที่ใช้ในการกรองรูปภาพหรือดึงข้อมูลจากรูปภาพได้&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;ทำไมต้องปรับสมดุลของฮิสโตแกรม ?&lt;/strong&gt;&lt;br&gt;
การปรับสมดุลของฮิสโตแกรมนั้น จะช่วยให้เราได้ภาพดิจิทัลที่ดียิ่งขึ้น&lt;br&gt;
และผลลัพธ์ที่ได้จากการคำนวณของฮิสโตแกรมจะเป็นเส้นโค้งเสมอ &lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 1 : Import Libraries&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;ติดตั้งไลบรารีที่ต้องใช้ ดังนี้&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;OpenCV (Open Source Computer Vision Library) ใช้ในการ   จัดการรูปภาพ&lt;/li&gt;
&lt;li&gt;NumPy (Numerical Python) ใช้ในการจัดการ Array&lt;/li&gt;
&lt;li&gt;PyPlot (Python Plotting) ใช้ในการพัฒนาและนำเสนอผลลัพธ์ใน   งานวิจัย การวิเคราะห์ข้อมูล หรือการนำเสนอผลงานทางวิทยาศาสตร์และ   เทคโนโลยีในรูปแบบของกราฟและภาพ
&lt;/li&gt;
&lt;/ol&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import cv2
from matplotlib import pyplot as pt
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 2 : นำข้อมูลรูปภาพเข้า&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;เลือกรูปภาพที่สนใจมา 1 รูป โดยในตัวอย่างนี้จะเลือกรูปนี้มา&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuvjr64ligaqafzv3429.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fjuvjr64ligaqafzv3429.jpg" alt="Image description" width="800" height="1066"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;เมื่อนำรูปมาใส่ในไฟล์แล้ว จะทำการอ่านและเก็บไว้ในตัวแปร cat&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;cat = cv2.imread("cat_01.jpg", 0)
cat_equalized = cv2.equalizeHist(cat)
cat_hist = cv2.calcHist(cat, [0], None, [256], [0, 256])
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;แล้วตัวแปร cat ไปผ่านกระบวนปรับสีให้กลายเป็นสีเทา และหาค่าฮิสโตแกรมของรูปภาพ&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pt.figure()
pt.tight_layout()
pt.subplot(1, 3, 1)
pt.title("Original image")
pt.imshow(cat, cmap='gray')

pt.subplot(1, 3, 2)
pt.title("Equalized Histogram Image")
pt.imshow(cat_equalized, cmap='gray')

pt.subplot(1, 3, 3)
pt.plot(cat_hist)
pt.title('Cat Histogram')
pt.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ผลลัพธ์ที่ได้&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3urh5wotz6e7lorj9521.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F3urh5wotz6e7lorj9521.png" alt="Image description" width="800" height="794"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;อย่างที่เห็น มันค่อนข้างที่จะทำได้ง่ายโดยการใช้ไลบรารีของ OpenCV&lt;br&gt;
แต่ imshow ที่มาจาก Pyplot นั้น ไม่สามารถทำงานได้ตามที่คาดหวังไว้ &lt;br&gt;
ถ้าเราไม่ได้ระบุสีไว้ใฟ้เหมือนกับตัวอย่างข้างต้น&lt;/p&gt;
&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 3 : การทำให้ฮิสโตแกรมเป็นมาตรฐาน&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;การที่จะทำให้ฮิสโตแกรมเป็นมาตรฐานนั้นจะต้องแปลงการกระจายตัวของความเข้มแบบไม่ต่อเนื่องให้เป็นการแจกแจงความน่าจะเป็นแบบไม่ต่อเนื่อง &lt;/p&gt;

&lt;p&gt;ทำให้เราต้องแบ่งแต่ละค่าของฮิสโตแกรมด้วยจำนวนของพิกเซล&lt;br&gt;
โดยเราจะต้องหารฮิสโตแกรมที่เท่ากันด้วยจำนวนพิกเซลทั้งหมด&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;pt.figure()
pt.tight_layout()
pt.subplot(2, 2, 1)
pt.title("Original image")
pt.imshow(cat, cmap='gray')

pt.subplot(2, 2, 2)
pt.title("Equalized Histogram Image")
pt.imshow(cat_equalized, cmap='gray')

pt.subplot(2, 2, 3)
pt.plot(cat_hist)
pt.title('Cat Histogram')

pt.subplot(2, 2, 4)
pt.plot(cat_hist_normalized)
pt.title('Cat Histogram Normalized')
pt.show()
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ก็จะได้ผลลัพธ์แบบนี้&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febubrnxkz960q1wzzcoq.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Febubrnxkz960q1wzzcoq.png" alt="Image description" width="800" height="815"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;จะเห็นได้จากรูปฝั่งขวาล่าง ค่าช่วงได้รับการปรับนั้นจะมีขนาดที่น้อยลง&lt;/p&gt;

&lt;p&gt;แต่ภาพสีเทาจะมีไบนารี่ที่ระนาบกับพิกเซลเพียงระนาบเดียว &lt;br&gt;
ส่วน RGB นั้นประกอบด้วย 3 ระนาบ โดยที่แต่ละสีจะมีระนาบเป็นของตัวเอง&lt;/p&gt;

&lt;blockquote&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;strong&gt;รู้หรือไม่ ?&lt;/strong&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;ไลบรารีของ OpenCV นั้นจะอ่านรูปภาพตามลำดับของระนาบที่ต่างกัน &lt;br&gt;
ไม่ใช่แบบ RGB แต่เป็นแบบ BGR&lt;/p&gt;
&lt;/blockquote&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;ขั้นตอนที่ 4 : สร้างฟังก์ชันประมวลผลภาพดิจิทัลออกมา&lt;/strong&gt;
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;src = cv.imread("efr.jpg")

bgr_planes = cv.split(src)
hist_size = 256
hist_range = (0, 256)  # the upper boundary is exclusive

r_hist = cv.calcHist(bgr_planes, [0], None, [hist_size], hist_range, accumulate=False)
g_hist = cv.calcHist(bgr_planes, [1], None, [hist_size], hist_range, accumulate=False)
b_hist = cv.calcHist(bgr_planes, [2], None, [hist_size], hist_range, accumulate=False)

hist_width = 512
hist_height = 400
bin_weight = int(round(hist_width / hist_size))

hist_image = np.zeros((hist_width, hist_height, 3), dtype=np.uint8)

cv.normalize(r_hist, r_hist, alpha=0, beta=hist_height, norm_type=cv.NORM_MINMAX)
cv.normalize(g_hist, g_hist, alpha=0, beta=hist_height, norm_type=cv.NORM_MINMAX)
cv.normalize(g_hist, g_hist, alpha=0, beta=hist_height, norm_type=cv.NORM_MINMAX)

for i in range(1, hist_size):
    cv.line(hist_image, (bin_weight * (i - 1), hist_height - int(b_hist[i - 1])),
            (bin_weight * i, hist_height - int(b_hist[i])),
            (255, 0, 0), thickness=2)
    cv.line(hist_image, (bin_weight * (i - 1), hist_height - int(g_hist[i - 1])),
            (bin_weight * i, hist_height - int(g_hist[i])),
            (0, 255, 0), thickness=2)
    cv.line(hist_image, (bin_weight * (i - 1), hist_height - int(r_hist[i - 1])),
            (bin_weight * i, hist_height - int(r_hist[i])),
            (0, 0, 255), thickness=2)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;นี้คือรูปที่จะเอามาใช้ในตัวอย่างนี้&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foykcccbwm11gk0318sil.jpg" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Foykcccbwm11gk0318sil.jpg" alt="Image description" width="736" height="1105"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;และนี้คือ ผลลัพธ์ที่ได้จาก"ฟังก์ชันประมวลผลภาพดิจิทัล"&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdppp33uzh4quyfwrgkpy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media.dev.to/cdn-cgi/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fdppp33uzh4quyfwrgkpy.png" alt="Image description" width="800" height="604"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;สรุปผล&lt;/strong&gt;
&lt;/h2&gt;

&lt;p&gt;เราสามารถปรับสมดุลของภาพให้มีความเป็นมาตรฐาน ผ่านการคำนวณ&lt;br&gt;
ฮิสโตแกรม โดยที่แต่ละสีของภาพจะมีการคำนวณฮิสโตแกรมที่ไม่เหมือนกัน &lt;br&gt;
เช่น ภาพที่เป็นสีเทาหรือขาวดำนั้นจะใช้การคำนวณฮิสโตแกรมแค่ระนาบเดียว&lt;br&gt;
แต่ภาพที่เป็น RGB จะใช้การคำนวณฮิสโตแกรมทั้งหมด 3 ระนาบ ทำให้เราสามารถนำกราฟที่ได้ไปใช้งานต่อได้ที่หลากหลายแบบ&lt;/p&gt;

&lt;h2&gt;
  
  
  &lt;strong&gt;Reference&lt;/strong&gt;
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://medium.com/@vrnsky/digital-image-processing-histogram-calculation-equalization-and-normalization-ad09b0bba5b1"&gt;https://medium.com/@vrnsky/digital-image-processing-histogram-calculation-equalization-and-normalization-ad09b0bba5b1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.pinterest.com"&gt;https://www.pinterest.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>ai</category>
      <category>python</category>
    </item>
  </channel>
</rss>
