OpenCV Adaptive Thresholding ใน Python พร้อมด้วย cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

OpenCV Adaptive Thresholding ใน Python ด้วย cv2.adaptiveThreshold()

บทนำ

Thresholding เป็นเทคนิคที่ง่ายและมีประสิทธิภาพในการแบ่งส่วนพื้นฐานในรูปภาพ และทำให้เป็นไบนารี่ (เปลี่ยนให้เป็นภาพไบนารี) โดยที่พิกเซลอยู่อย่างใดอย่างหนึ่ง 0 or 1 (หรือ 255 หากคุณใช้จำนวนเต็มแทนจำนวนเต็ม)

โดยทั่วไป คุณสามารถใช้การจำกัดขอบเขตเพื่อทำการแบ่งส่วนพื้นหลัง-เบื้องหน้าอย่างง่ายในรูปภาพ และรวมถึงตัวแปรโดยใช้เทคนิคง่ายๆ สำหรับแต่ละพิกเซล:

if pixel_value > threshold:
    pixel_value = MAX
else:
    pixel_value = 0

การกำหนดเกณฑ์อย่างง่ายมีปัญหาที่ชัดเจนและต้องการข้อมูลที่บริสุทธิ์พอสมควร ซึ่งทำให้ไม่สามารถใช้งานได้จริงสำหรับกรณีการใช้งานจำนวนมาก ผู้กระทำผิดหลักคือธรณีประตูส่วนกลางซึ่งนำไปใช้กับรูปภาพทั้งหมด ในขณะที่รูปภาพมักจะไม่เท่ากันเพียงพอสำหรับธรณีประตูแบบครอบคลุมที่จะทำงานได้ เว้นแต่จะเป็นของปลอม

เกณฑ์สากลจะทำงานได้ดีในการแยกอักขระในหนังสือขาวดำบนหน้าที่สแกน เกณฑ์ทั่วโลกมักจะล้มเหลวในรูปภาพโทรศัพท์ของหน้าเดียวกันนั้น เนื่องจากสภาพแสงอาจแตกต่างกันระหว่างส่วนต่างๆ ของหน้า ทำให้จุดตัดทั่วโลกมีความอ่อนไหวต่อข้อมูลจริงมากเกินไป

เพื่อต่อสู้กับสิ่งนี้ – เราจ้างได้ ในประเทศ ธรณีประตูโดยใช้เทคนิคที่เรียกว่า การปรับตัวตามเกณฑ์. แทนที่จะรักษาทุกส่วนของภาพด้วยกฎเดียวกัน เราสามารถเปลี่ยนเกณฑ์สำหรับแต่ละส่วนได้ พื้นที่ท้องถิ่น ที่ดูเหมาะสมกับมัน ซึ่งทำให้การกำหนดเกณฑ์ไม่เปลี่ยนแปลงบางส่วนกับการเปลี่ยนแปลงของแสง เสียง และปัจจัยอื่นๆ แม้ว่าจะมีประโยชน์มากกว่าการจำกัดขอบเขตทั่วโลก แต่การจำกัดเกณฑ์เองนั้นเป็นเทคนิคที่จำกัดและเข้มงวด และเหมาะที่สุดสำหรับความช่วยเหลือในการประมวลผลภาพล่วงหน้า (โดยเฉพาะอย่างยิ่งเมื่อต้องระบุรูปภาพที่จะทิ้ง) มากกว่าการแบ่งส่วน

สำหรับแอปพลิเคชันที่ละเอียดอ่อนมากขึ้นซึ่งต้องการบริบท คุณควรใช้เทคนิคขั้นสูง ซึ่งรวมถึงการเรียนรู้เชิงลึก ซึ่งได้ขับเคลื่อนความก้าวหน้าล่าสุดในการมองเห็นด้วยคอมพิวเตอร์

Adaptive Thresholding ด้วย OpenCV

มาโหลดรูปภาพที่มีสภาพแสงแบบปรับได้ โดยที่ส่วนหนึ่งของภาพอยู่ในโฟกัสมากกว่าส่วนอื่น โดยที่รูปภาพถูกถ่ายจากมุมหนึ่ง รูปภาพที่ฉันถ่ายของ Harold McGee's “เรื่องอาหารและการทำอาหาร” จะให้บริการที่ดี!

img = cv2.imread('book.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
plt.imshow(img)

ตอนนี้ เราใช้เกณฑ์ปกติเพื่อแยกตัวอักษรออกจากพื้นหลัง เนื่องจากมีความแตกต่างของสีที่ชัดเจน กระดาษสีทั้งหมดจะถือเป็นพื้นหลัง เนื่องจากเราไม่รู้จริงๆ ว่าเกณฑ์ควรเป็นอย่างไร ลองใช้วิธีของ Otsu เพื่อหาค่าที่เหมาะสม โดยคาดว่าภาพจะค่อนข้างไบโมดอล (ส่วนใหญ่มีสองสีเป็นหลัก):

img = cv2.imread('book.jpg')


gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)

ret, mask = cv2.threshold(blurred, 0, 255, cv2.THRESH_OTSU)
print(f'Threshold: {ret}')

fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))

มาดูผลลัพธ์กัน:

OpenCV Adaptive Thresholding ใน Python พร้อมด้วย cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

อุ๊ย ส่วนด้านซ้ายของข้อความส่วนใหญ่จะจางลง เงารอบๆ รางน้ำกินส่วนหนึ่งของภาพไปจนหมด และข้อความก็อิ่มตัวเกินไป! นี่คือภาพ "ในธรรมชาติ" และกฎแบบครอบคลุม เช่น การจำกัดขอบเขตทั่วโลกทำงานได้ไม่ดี เกณฑ์ควรเป็นอย่างไร? ขึ้นอยู่กับส่วนของภาพ!

พื้นที่ cv2.adaptiveThreshold() วิธีช่วยให้เราทำสิ่งนี้ได้อย่างแน่นอน:

cv2.adaptiveThreshold(img, 
                      max_value, 
                      adaptive_method, 
                      threshold_method, 
                      block_size, 
                      C)

พื้นที่ adaptive_method สามารถ a cv2.ADAPTIVE_THRESH_MEAN_C or cv2.ADAPTIVE_THRESH_GAUSSIAN_Cที่นี่มี C เป็นอาร์กิวเมนต์สุดท้ายที่คุณตั้งไว้ ทั้งสองวิธีคำนวณเกณฑ์ตามเพื่อนบ้านของพิกเซลที่เป็นปัญหาโดยที่ block_size กำหนดจำนวนเพื่อนบ้านที่จะพิจารณา (พื้นที่ใกล้เคียง)

ADAPTIVE_THRESH_MEAN_C เอาค่าเฉลี่ยเพื่อนบ้านมาหัก Cในขณะที่ ADAPTIVE_THRESH_GAUSSIAN_C เอาผลรวมถ่วงน้ำหนักของเพื่อนบ้านแล้วหัก C.

ดูคู่มือเชิงปฏิบัติสำหรับการเรียนรู้ Git ที่มีแนวทางปฏิบัติที่ดีที่สุด มาตรฐานที่ยอมรับในอุตสาหกรรม และเอกสารสรุปรวม หยุดคำสั่ง Googling Git และจริงๆ แล้ว เรียน มัน!

นอกจากนี้ยังช่วยให้คุณกำหนดกลยุทธ์ไบนารีได้ แต่จำกัดไว้ที่ THRESH_BINARY และ THRESH_BINARY_INVและการเปลี่ยนระหว่างสิ่งเหล่านี้จะสลับระหว่าง "พื้นหลัง" และ "เบื้องหน้า" อย่างมีประสิทธิภาพ

วิธีนี้จะคืนค่ามาสก์สำหรับรูปภาพ ไม่ใช่รหัสส่งคืนและมาสก์ มาลองแบ่งกลุ่มอักขระในภาพเดียวกันเหมือนเมื่อก่อน โดยใช้เกณฑ์แบบปรับได้:


img = cv2.imread('book.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
blurred = cv2.GaussianBlur(gray, (7, 7), 0)


mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_MEAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)


fig, ax = plt.subplots(1, 2, figsize=(12, 5))
ax[0].imshow(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
ax[1].imshow(cv2.cvtColor(mask, cv2.COLOR_BGR2RGB))
plt.tight_layout()

ส่งผลให้ภาพชัดเจนขึ้นมาก:

OpenCV Adaptive Thresholding ใน Python พร้อมด้วย cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

หมายเหตุ พื้นที่ block_size อาร์กิวเมนต์ต้องเป็นจำนวนไม่เท่ากัน

ในทำนองเดียวกัน เราสามารถใช้เกณฑ์แบบเกาส์เซียนได้:

mask = cv2.adaptiveThreshold(blurred, 
                              255, 
                              cv2.ADAPTIVE_THRESH_GAUSSIAN_C, 
                              cv2.THRESH_BINARY, 
                              31, 
                              10)

ซึ่งสร้างภาพที่น่าพึงพอใจในที่สุด:

OpenCV Adaptive Thresholding ใน Python พร้อมด้วย cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

ทั้งขนาดบล็อก (พื้นที่ใกล้เคียง) และ C เป็นไฮเปอร์พารามิเตอร์ที่จะปรับแต่งที่นี่ ลองใช้ค่าต่างๆ และเลือกค่าที่เหมาะสมกับภาพของคุณมากที่สุด โดยทั่วไป ค่า Gaussian Thresholding จะไวต่อสัญญาณรบกวนน้อยกว่า และจะทำให้เกิดภาพที่เยือกเย็นกว่าและสะอาดกว่าเล็กน้อย แต่จะแตกต่างกันไปและขึ้นอยู่กับอินพุต

ข้อ จำกัด ของเกณฑ์การปรับตัว

ด้วยการกำหนดธรณีประตูแบบปรับได้ เราสามารถหลีกเลี่ยงข้อจำกัดที่ครอบคลุมของธรณีประตูได้ แต่ก็ยังค่อนข้างเข้มงวดและไม่ได้ผลดีสำหรับอินพุตที่มีสีสัน ตัวอย่างเช่น หากเราโหลดรูปภาพของกรรไกรและชุดอุปกรณ์ขนาดเล็กที่มีสีต่างกัน แม้แต่การกำหนดเกณฑ์แบบปรับได้ก็ยังมีปัญหาในการแบ่งส่วนอย่างถูกต้อง โดยมีการสรุปคุณลักษณะสีเข้มบางอย่าง แต่ไม่มีการพิจารณาวัตถุทั้งหมด:

OpenCV Adaptive Thresholding ใน Python พร้อมด้วย cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

ถ้าเราปรับขนาดบล็อกและ Cเราสามารถกำหนดให้แพทช์ที่ใหญ่กว่าเป็นส่วนหนึ่งของวัตถุเดียวกันได้ แต่จากนั้นก็พบปัญหาในการสร้างขนาดเพื่อนบ้าน สากลเกินไปกลับไปสู่ปัญหาเดียวกันกับขีดจำกัดทั่วโลก:

OpenCV Adaptive Thresholding ใน Python พร้อมด้วย cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

สรุป

ในช่วงไม่กี่ปีที่ผ่านมา การแบ่งกลุ่มแบบไบนารี (เช่นเดียวกับที่เราทำที่นี่) และการแบ่งกลุ่มแบบหลายป้ายกำกับ (ซึ่งคุณสามารถเข้ารหัสคลาสได้ตามต้องการ) ได้สร้างโมเดลสำเร็จด้วยเครือข่ายการเรียนรู้เชิงลึก ซึ่งมีประสิทธิภาพและยืดหยุ่นมากกว่ามาก นอกจากนี้ ยังสามารถเข้ารหัสบริบทส่วนกลางและท้องถิ่นลงในรูปภาพที่แบ่งกลุ่มได้ ข้อเสียคือ คุณต้องใช้ข้อมูลในการฝึกอบรม ตลอดจนเวลาและความเชี่ยวชาญ

คุณสามารถใช้ OpenCV และต่อสู้กับข้อจำกัดบางอย่างได้โดยใช้การจำกัดขีดจำกัดแบบปรับเปลี่ยนได้ แทนที่จะใช้กลยุทธ์การกำหนดขีดจำกัดทั่วโลก เพื่อการแบ่งส่วนระดับการผลิตที่แม่นยำ คุณจะต้องใช้โครงข่ายประสาทเทียม

ก้าวต่อไป – การเรียนรู้เชิงลึกเชิงปฏิบัติสำหรับคอมพิวเตอร์วิทัศน์

ธรรมชาติที่อยากรู้อยากเห็นของคุณทำให้คุณต้องการไปต่อหรือไม่? เราขอแนะนำให้ตรวจสอบของเรา คอร์ส: “การเรียนรู้เชิงลึกเชิงปฏิบัติสำหรับคอมพิวเตอร์วิทัศน์ด้วย Python”.

OpenCV Adaptive Thresholding ใน Python พร้อมด้วย cv2.adaptiveThreshold() PlatoBlockchain Data Intelligence ค้นหาแนวตั้ง AI.

หลักสูตร Computer Vision อื่น?

เราจะไม่ทำการจำแนกตัวเลข MNIST หรือแฟชั่น MNIST พวกเขาทำหน้าที่ส่วนของตนเมื่อนานมาแล้ว ทรัพยากรการเรียนรู้จำนวนมากเกินไปมุ่งเน้นไปที่ชุดข้อมูลพื้นฐานและสถาปัตยกรรมพื้นฐาน ก่อนปล่อยให้สถาปัตยกรรมกล่องดำขั้นสูงรับภาระด้านประสิทธิภาพ

เราต้องการที่จะมุ่งเน้นไปที่ การทำให้ลึกลับ, การปฏิบัติจริง, ความเข้าใจ, ปรีชา และ โครงการจริง. ต้องการเรียน อย่างไร คุณสามารถสร้างความแตกต่าง? เราจะพาคุณเดินทางตั้งแต่วิธีที่สมองของเราประมวลผลภาพไปจนถึงการเขียนตัวแยกประเภทการเรียนรู้เชิงลึกระดับการวิจัยสำหรับมะเร็งเต้านม ไปจนถึงเครือข่ายการเรียนรู้เชิงลึกที่ "หลอน" สอนหลักการและทฤษฎีแก่คุณผ่านการทำงานจริง เพื่อให้คุณมี ความรู้และเครื่องมือในการเป็นผู้เชี่ยวชาญในการประยุกต์ใช้การเรียนรู้เชิงลึกเพื่อแก้ปัญหาคอมพิวเตอร์วิทัศน์

อะไรอยู่ข้างใน?

  • หลักการมองเห็นเบื้องต้นและวิธีการสอนคอมพิวเตอร์ให้ “มองเห็น”
  • งานต่างๆ และการประยุกต์ใช้คอมพิวเตอร์วิทัศน์
  • เครื่องมือการค้าที่จะทำให้งานของคุณง่ายขึ้น
  • การค้นหา การสร้าง และการใช้ชุดข้อมูลสำหรับคอมพิวเตอร์วิทัศน์
  • ทฤษฎีและการประยุกต์ใช้ Convolutional Neural Networks
  • การจัดการการเปลี่ยนแปลงโดเมน การเกิดขึ้นร่วม และอคติอื่นๆ ในชุดข้อมูล
  • ถ่ายทอดการเรียนรู้และใช้เวลาฝึกอบรมและทรัพยากรการคำนวณของผู้อื่นเพื่อประโยชน์ของคุณ
  • การสร้างและฝึกอบรมผู้จำแนกมะเร็งเต้านมที่ล้ำสมัย
  • วิธีการใช้ความสงสัยที่ดีต่อสุขภาพกับแนวคิดกระแสหลักและทำความเข้าใจกับความหมายของเทคนิคที่นำมาใช้กันอย่างแพร่หลาย
  • การแสดงภาพ "พื้นที่แนวคิด" ของ ConvNet โดยใช้ t-SNE และ PCA
  • กรณีศึกษาวิธีที่บริษัทต่างๆ ใช้เทคนิคการมองเห็นด้วยคอมพิวเตอร์เพื่อให้ได้ผลลัพธ์ที่ดีขึ้น
  • การประเมินแบบจำลองที่เหมาะสม การสร้างภาพพื้นที่แฝง และการระบุความสนใจของแบบจำลอง
  • ดำเนินการวิจัยโดเมน ประมวลผลชุดข้อมูลของคุณเอง และสร้างการทดสอบแบบจำลอง
  • สถาปัตยกรรมล้ำสมัย ความก้าวหน้าของแนวคิด สิ่งที่ทำให้มีเอกลักษณ์เฉพาะตัว และวิธีนำไปใช้
  • KerasCV – ไลบรารี WIP สำหรับสร้างไปป์ไลน์และโมเดลที่ทันสมัย
  • วิธีแยกวิเคราะห์และอ่านเอกสารและนำไปใช้เอง
  • การเลือกรุ่นขึ้นอยู่กับการใช้งานของคุณ
  • การสร้างไปป์ไลน์การเรียนรู้ของเครื่องแบบ end-to-end
  • ภูมิทัศน์และสัญชาตญาณในการตรวจจับวัตถุด้วย R-CNN ที่เร็วกว่า, RetinaNets, SSD และ YOLO
  • การแบ่งกลุ่มตัวอย่างและความหมาย
  • การจดจำวัตถุแบบเรียลไทม์ด้วย YOLOv5
  • การฝึกอบรมเครื่องตรวจจับวัตถุ YOLOv5
  • การทำงานกับ Transformers โดยใช้ KerasNLP (ไลบรารี WIP ที่มีความแข็งแกร่งในอุตสาหกรรม)
  • การรวม Transformers เข้ากับ ConvNets เพื่อสร้างคำบรรยายภาพ
  • Deepdream
  • การเพิ่มประสิทธิภาพโมเดล Deep Learning สำหรับคอมพิวเตอร์วิทัศน์

ประทับเวลา:

เพิ่มเติมจาก สแต็ค