เบลอเกาส์
Gaussian Blur หรือที่รู้จักกันในชื่อ Gaussian Smoothing เป็นเอฟเฟกต์การประมวลผลที่ใช้กันอย่างแพร่หลายในซอฟต์แวร์ประมวลผลภาพเช่น Adobe Photoshop, Gimp และ Paint.net มันมักจะใช้เพื่อลดเสียงรบกวนของภาพและลดระดับรายละเอียด เอฟเฟกต์ภาพของภาพที่สร้างขึ้นโดยเทคโนโลยีเบลอนี้เป็นเหมือนการสังเกตภาพผ่านหน้าจอโปร่งแสงซึ่งแตกต่างอย่างมีนัยสำคัญจากเลนส์เอฟเฟกต์การถ่ายภาพนอกโฟกัสโบเก้และเงาแสงธรรมดา การปรับให้เรียบแบบเกาส์เซียนยังใช้ในขั้นตอนการประมวลผลล่วงหน้าในอัลกอริทึมการมองเห็นคอมพิวเตอร์เพื่อเพิ่มเอฟเฟกต์ภาพของภาพในระดับที่แตกต่างกัน จากมุมมองทางคณิตศาสตร์กระบวนการเบลอแบบเกาส์เซียนของภาพนั้นมีความสัมพันธ์กับการแจกแจงแบบปกติ เนื่องจากการกระจายปกติเรียกว่าการกระจายแบบเกาส์เซียนเทคโนโลยีนี้เรียกว่าฟัซซี่เกาส์เซียน การประชุมของภาพและความเบลอสี่เหลี่ยมวงกลมจะสร้างเอฟเฟกต์การถ่ายภาพนอกโฟกัสที่แม่นยำยิ่งขึ้น เนื่องจากการแปลงฟูริเยร์ของฟังก์ชั่น Gaussian เป็นฟังก์ชั่น Gaussian อีกฟังก์ชั่น Gaussian Blur เป็นตัวกรอง Low-Pass สำหรับภาพ
Gaussian Fuzzing ใช้ฟังก์ชั่นความหนาแน่นการกระจายปกติของ Gaussian เพื่อคำนวณการเปลี่ยนแปลงของแต่ละพิกเซลในภาพ
ขึ้นอยู่กับฟังก์ชั่น Gaussian แบบหนึ่งมิติสามารถรับฟังก์ชั่น Gaussian สองมิติได้:
โดยที่ r คือรัศมีฟัซซี่ r^2 = x^2 + y^2 และσคือค่าเบี่ยงเบนมาตรฐานของการแจกแจงปกติ ในพื้นที่สองมิติเส้นชั้นความสูงของพื้นผิวที่สร้างขึ้นโดยสูตรนี้เป็นวงกลมศูนย์กลางที่มักจะกระจายจากศูนย์กลาง เมทริกซ์ convolution ประกอบด้วยพิกเซลที่มีการกระจายที่ไม่ใช่ศูนย์จะถูกแปลงด้วยภาพต้นฉบับ ค่าของแต่ละพิกเซลเป็นค่าเฉลี่ยถ่วงน้ำหนักของค่าของพิกเซลใกล้เคียงรอบ ๆ มูลค่าของพิกเซลดั้งเดิมมีค่าการกระจายแบบเกาส์ที่ใหญ่ที่สุดดังนั้นจึงมีน้ำหนักมากที่สุด ในขณะที่พิกเซลที่อยู่ติดกันนั้นไกลออกไปและไกลออกไปจากพิกเซลดั้งเดิมน้ำหนักของพวกเขาจะเล็กลงและเล็กลง กระบวนการฟัซซิ่งนี้รักษาเอฟเฟกต์ขอบมากกว่าตัวกรองฟัซซี่การทำให้เท่าเทียมกันอื่น ๆ
ในความเป็นจริงมันเป็นเรื่องง่ายที่จะใช้ Gaussian Blur บน iOS เร็วเท่าที่ iOS 5.0 มี API ภาพหลักและมีการใช้งานตัวกรองจำนวนมากในห้องสมุด CoreImage.Framework
+(uiimage *) coreBlurimage: (uiimage *) ภาพ withblurnumber: (cgfloat) เบลอ {cicontext *context = [cicontext contextwithOptions: nil]; ciimage *inputImage = [ciimage imageWithCGImage: image.cgimage]; // set filter cifilter *filter = [cifilter filterwithName:@"cigaussianblur"]; [ตัวกรอง setValue: inputImage forkey: kciinputimageKey]; [ตัวกรอง setValue: @(เบลอ) forkey: @"inputRadius"]; // blurimage ciimage *result = [ตัวกรอง ValueForkey: kcioutputimageKey]; cgimageRef outimage = [บริบท createCgimage: ผลลัพธ์จากการแก้ไข: [ขอบเขตผลลัพธ์]]; uiimage *blurimage = [uiimage imageWithCGIMAGE: outimage]; cgimagerelease (outimage); ส่งคืน Blurimage;}นอกจากนี้คุณยังสามารถใช้ API - Renderscript เพื่อใช้ Gaussian Blur กับ Android แต่ API ของ Android สูงกว่า 17 ซึ่งเป็น Android เวอร์ชัน 4.2
/** * อัลกอริทึมสำหรับการใช้ Gaussian Fuzzy โดยใช้ RenderScript * @param บิตแมป * @return */บิตแมปสาธารณะเบลอ (บิตแมปบิตแมป) {// มาสร้างบิตแมปที่ว่างเปล่าด้วยขนาดของบิตแมป bitmap.getheight (), bitmap.config.argb_8888); // อินสแตนซ์ใหม่ renderscriptrenderscript rs = renderscript.create (getApplicationContext ()); // สร้างสคริปต์ที่เบลอ Element.U8_4 (RS)); // สร้างการจัดสรร (เข้า/ออก) ด้วย RendERScript และ BitmapsAllocation allin = allocation.createFrombitMap (RS, บิตแมป); การจัดสรรการจัดสรร = การจัดสรร 25blurscript.setradius (20.0f); // ดำเนินการ renderscriptbliruscript.setInput (allin); blurscript.foreach (allout); // คัดลอกบิตแมปสุดท้ายที่สร้างขึ้นโดย outallocation ไปยัง outbitmapallout.copyto (Outbitmap); // renderscript.rs.destroy (); return outbitmap;}เฟรมภาพ CV4J ที่เราพัฒนายังมีตัวกรองเพื่อใช้เบลอแบบเกาส์เซียน
ตัวกรอง gaussianblurfilter = ใหม่ gaussianblurfilter (); filter.setsigma (10); rximagedata.bitmap (bitmap) .addfilter (ตัวกรอง) .into (Image2);
จะเห็นได้ว่าฟัซซี่แบบเกาส์เซียนที่ใช้ใน CV4J นั้นสอดคล้องกับผลของการใช้งาน RendERScript
ในหมู่พวกเขารหัสของ Gaussianblurfilter มีดังนี้:
ชั้นเรียนสาธารณะ GaussianBlurfilter ใช้ CommonFilter {Private Float [] เคอร์เนล; sigma คู่ส่วนตัว = 2; ExecutorService mexecutor; PrectiONSERSERVICE <Void> บริการสาธารณะ gaussianblurfilter () {kernel = new float [0]; ตัวกรอง (ImageProcessor ขั้นสุดท้าย src) {ความกว้าง int สุดท้าย = src.getWidth (); ความสูง int สุดท้าย = src.getheight (); ขนาด int สุดท้าย = ความกว้าง*ความสูง; int dims = src.getchannels (); makegaussiankernel TaskUtils.newFixedThreadPool ("CV4J", DIMS); บริการ = ใหม่ ExecutOrcompleTionservice <> (mexecutor); // บันทึกผลลัพธ์ (int i = 0; i <dims; i ++) {final int temp = i; service.submit src.tobyte (temp); byte [] temp = byte ใหม่ [ขนาด]; เบลอ (inpixels, อุณหภูมิ, ความกว้าง, ความสูง); // h gaussianblur (อุณหภูมิ, inpixels, ความสูง, กว้าง); (interruptedException E) {E.printStackTrace ();}} mexecutor.shutdown (); return src;}/** * <p> นี่คือ 1d gaussian, </p> * @param inpixels * @param Outpixels * @param ความกว้าง * @param ความกว้าง, ความสูง int) {int subcol = 0; int index = 0, index2 = 0; float sum = 0; int k = kernel.length -1; สำหรับ (int แถว = 0; แถว <ความสูง; แถว ++) {int c = 0; index = แถว; + m; if (subcol <0 || subcol> = ความกว้าง) {subcol = 0;}} index2 = แถว * width + subcol; c = inpixels [index2] & 0xff; sum + = c * kernel [math.abs (m)]; Makegaussiankernel (sigma สองครั้งสุดท้าย, ความแม่นยำสองเท่าสุดท้าย, int maxradius) {int kradius = (int) math.ceil (sigma*math.sqrt (-2*math.log (ความแม่นยำ))+1; ถ้า (maxradius <50) maxradius = 50; kradius = maxradius; เคอร์เนล = ใหม่ลอย [kradius]; สำหรับ (int i = 0; i <kradius; i ++) // gaussian functionkernel [i] = (float) (math.exp (-0.5*i*i/sigma/sigma)); เคอร์เนล [0]; สำหรับ (int i = 1; i <kradius; i ++) sum+= 2*เคอร์เนล [i];} else sum = sigma*math.sqrt (2*math.pi); สำหรับ (int i = 0; i <kradius; i ++) {double v = (เคอร์เนล [i]/sum); เคอร์เนล [i] = (ลอย) v;} return;}}}อวกาศ
การเชื่อมโยงสองมิติมักจะพบในการประมวลผลภาพและรูปแบบที่ไม่ต่อเนื่องของการประชุมสองมิติส่วนใหญ่ใช้ในการประมวลผลภาพ
ต่อไปนี้เป็นเอฟเฟกต์การควบคุมที่หลากหลายที่ใช้โดย CV4J
ปัจจุบัน CV4J รองรับตัวกรองเชิงพื้นที่ต่อไปนี้
| กรอง | ชื่อ | ผล |
|---|---|---|
| Convolutionhvfilter | การสานต่อ | เบลอหรือลดเสียงรบกวน |
| minmaxfilter | การกรองสูงสุดและต่ำสุด | การปฏิเสธ |
| sapnoisefilter | เสียงเกลือและพริกไทย | เพิ่มเสียงรบกวน |
| ผู้ที่มีความคมชัด | คมชัด | ที่ได้รับการปรับปรุง |
| ผู้มีสติ | การกรองเฉลี่ย | การปฏิเสธ |
| Laplasfilter | สถานที่ | แยกขอบ |
| FindEdgeFilter | ค้นหาขอบ | การสกัดไล่ระดับสี |
| ผู้สะอิดสะเอียน | การไล่ระดับสี | รับการสกัดแบบไล่ระดับสีในทิศทาง x และ y |
| VarianceFilter | การกรองความแปรปรวน | การกรองสูงผ่าน |
| maeroperatorfilter | การผ่าตัด | การกรองสูงผ่าน |
| USMFilter | USM | ที่ได้รับการปรับปรุง |
CV4J เป็นห้องสมุดการประมวลผลภาพที่พัฒนาโดย Gloomyfish และ I และยังอยู่ในรุ่นแรก
ฟังก์ชั่นที่นำไปใช้ในปัจจุบัน:
สัปดาห์นี้เราทำการปรับเปลี่ยนที่สำคัญกับ CV4J และปรับสถาปัตยกรรมโดยรวมให้เหมาะสม ฟังก์ชั่น convolution เชิงพื้นที่ (การเพิ่มประสิทธิภาพของภาพ, การลับคม, เบลอ ฯลฯ ) ก็ถูกเพิ่มเข้ามา ต่อไปเราจะทำการวิเคราะห์ภาพไบนารี (การกัดกร่อน, การขยาย, การเปิดและปิดการดำเนินการ, การสกัดรูปร่าง ฯลฯ )
สรุป
ข้างต้นเป็นเนื้อหาทั้งหมดของบทความนี้เกี่ยวกับการเขียนโปรแกรม Java เพื่อใช้การเบลอแบบเกาส์และภาพเชิงพื้นที่ของภาพ ฉันหวังว่ามันจะเป็นประโยชน์กับทุกคน เพื่อนที่สนใจสามารถอ้างถึงเว็บไซต์นี้ต่อไปได้:
รหัส Java 70 บรรทัดเพื่อใช้การแบ่งปันอัลกอริทึมเครือข่ายประสาทลึก
ภาษา Java ใช้ตัวอย่างรหัสของอัลกอริทึม Cruzkal ตามกราฟที่ได้รับอนุญาตแบบไม่ได้บอกทิศทาง
ตัวอย่างรหัสที่สมบูรณ์ของอัลกอริทึม Java เพื่อใช้ต้นไม้สีแดงและสีดำ
หากมีข้อบกพร่องใด ๆ โปรดฝากข้อความไว้เพื่อชี้ให้เห็น ขอบคุณเพื่อนที่ให้การสนับสนุนเว็บไซต์นี้!