IOS OpenGL ES GPUImage 圖像閾值邊緣檢測GPUImageThresholdEdgeDetectionFilter

来源:https://www.cnblogs.com/shuopython/archive/2022/07/28/16530608.html
-Advertisement-
Play Games

目錄 一.簡介 二.效果演示 三.源碼下載 四.猜你喜歡 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎 零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場 零基礎 O ...


目錄

零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 基礎

零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 轉場

零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 特效

零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES 函數

零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES GPUImage 使用

零基礎 OpenGL (ES) 學習路線推薦 : OpenGL (ES) 學習目錄 >> OpenGL ES GLSL 編程

一.簡介

GPUImage 共 125 個濾鏡, 分為四類

1、Color adjustments : 31 filters , 顏色處理相關
2、Image processing : 40 filters , 圖像處理相關.
3、Blending modes : 29 filters , 混合模式相關.
4、Visual effects : 25 filters , 視覺效果相關.

GPUImageThresholdEdgeDetectionFilter 屬於 GPUImage 圖像視覺效果相關,用於圖像閾值邊緣檢測。shader 源碼如下:

/******************************************************************************************/
//@Author:猿說編程
//@Blog(個人博客地址): www.codersrc.com
//@File:IOS – OpenGL ES GPUImage GPUImageThresholdEdgeDetectionFilter
//@Time:2022/06/26 06:30
//@Motto:不積跬步無以至千里,不積小流無以成江海,程式人生的精彩需要堅持不懈地積累!
/******************************************************************************************/

// Invert the colorspace for a sketch
#if TARGET_IPHONE_SIMULATOR || TARGET_OS_IPHONE
NSString *const kGPUImageThresholdEdgeDetectionFragmentShaderString = SHADER_STRING
(
 precision highp float;

 varying vec2 textureCoordinate;
 varying vec2 leftTextureCoordinate;
 varying vec2 rightTextureCoordinate;

 varying vec2 topTextureCoordinate;
 varying vec2 topLeftTextureCoordinate;
 varying vec2 topRightTextureCoordinate;

 varying vec2 bottomTextureCoordinate;
 varying vec2 bottomLeftTextureCoordinate;
 varying vec2 bottomRightTextureCoordinate;

 uniform sampler2D inputImageTexture;
 uniform lowp float threshold;

 uniform float edgeStrength;

 void main()
 {
//     float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r;
//     float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r;
//     float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r;
//     float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r;
     float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r;
     float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r;
     float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r;
     float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r;
     float centerIntensity = texture2D(inputImageTexture, textureCoordinate).r;
//     float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity;
//     float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity;
//     float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + leftIntensity + 2.0 * centerIntensity + rightIntensity;
//     float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomIntensity + 2.0 * centerIntensity + topIntensity;
     float h = (centerIntensity - topIntensity) + (bottomIntensity - centerIntensity);
     float v = (centerIntensity - leftIntensity) + (rightIntensity - centerIntensity);
//     float h = (centerIntensity - topIntensity);
//     float j = (topIntensity - centerIntensity);
//     h = max(h,j);
//     j = abs(h);
//     float v = (centerIntensity - leftIntensity);

    float mag = length(vec2(h, v)) * edgeStrength;
     mag = step(threshold, mag);

//     float mag = abs(h);

//     gl_FragColor = vec4(h, h, h, 1.0);
//     gl_FragColor = vec4(texture2D(inputImageTexture, textureCoordinate));
//     gl_FragColor = vec4(h, centerIntensity, j, 1.0);
     gl_FragColor = vec4(mag, mag, mag, 1.0);
 }
);
#else
NSString *const kGPUImageThresholdEdgeDetectionFragmentShaderString = SHADER_STRING
(
 varying vec2 textureCoordinate;
 varying vec2 leftTextureCoordinate;
 varying vec2 rightTextureCoordinate;

 varying vec2 topTextureCoordinate;
 varying vec2 topLeftTextureCoordinate;
 varying vec2 topRightTextureCoordinate;

 varying vec2 bottomTextureCoordinate;
 varying vec2 bottomLeftTextureCoordinate;
 varying vec2 bottomRightTextureCoordinate;

 uniform sampler2D inputImageTexture;
 uniform float threshold;

 uniform float edgeStrength;

 void main()
 {
     float bottomLeftIntensity = texture2D(inputImageTexture, bottomLeftTextureCoordinate).r;
     float topRightIntensity = texture2D(inputImageTexture, topRightTextureCoordinate).r;
     float topLeftIntensity = texture2D(inputImageTexture, topLeftTextureCoordinate).r;
     float bottomRightIntensity = texture2D(inputImageTexture, bottomRightTextureCoordinate).r;
     float leftIntensity = texture2D(inputImageTexture, leftTextureCoordinate).r;
     float rightIntensity = texture2D(inputImageTexture, rightTextureCoordinate).r;
     float bottomIntensity = texture2D(inputImageTexture, bottomTextureCoordinate).r;
     float topIntensity = texture2D(inputImageTexture, topTextureCoordinate).r;
     float h = -topLeftIntensity - 2.0 * topIntensity - topRightIntensity + bottomLeftIntensity + 2.0 * bottomIntensity + bottomRightIntensity;
     h = max(0.0, h);
     float v = -bottomLeftIntensity - 2.0 * leftIntensity - topLeftIntensity + bottomRightIntensity + 2.0 * rightIntensity + topRightIntensity;
     v = max(0.0, v);

     float mag = length(vec2(h, v)) * edgeStrength;
     mag = step(threshold, mag);

     gl_FragColor = vec4(vec3(mag), 1.0);
 }
);
#endif

二.效果演示

使用 GPUImageThresholdEdgeDetectionFilter **,**原圖如下:

使用 GPUImageThresholdEdgeDetectionFilter 效果如下:

三.源碼下載

OpenGL ES Demo 下載地址 : IOS OpenGL ES GPUImage 圖像閾值邊緣檢測 GPUImageThresholdEdgeDetectionFilter

四.猜你喜歡

  1. IOS OPenGL ES 設置圖像亮度 GPUImageBrightnessFilter
  2. IOS OPenGL ES 調節圖像曝光度 GPUImageExposureFilter
  3. IOS OpenGL ES 調節圖像對比度 GPUImageContrastFilter
  4. IOS OPenGL ES 調節圖像飽和度 GPUImageSaturationFilter
  5. IOS OPenGL ES 調節圖像伽馬線 GPUImageGammaFilter
  6. IOS OpenGL ES 調節圖像反色 GPUImageColorInvertFilter
  7. IOS OpenGL ES 調節圖像褐色 GPUImageSepiaFilter
  8. IOS OpenGL ES 調節圖像灰色 GPUImageGrayscaleFilter
  9. IOS OpenGL ES 調節圖像 RGB 通道 GPUImageRGBFilter
  10. IOS OpenGL ES 調節圖像不透明度 GPUImageOpacityFilter
  11. IOS OpenGL ES 調節圖像陰影 GPUImageHighlightShadowFilter
  12. IOS OpenGL ES 調節圖像色彩替換 GPUImageFalseColorFilter
  13. GPUImage – 色彩直方圖 GPUImageHistogramFilter
  14. GPUImage – 色彩直方圖 GPUImageHistogramGenerator
  15. GPUImage – 像素平均色值 GPUImageAverageColor
  16. GPUImage – 亮度平均 GPUImageLuminosity
  17. IOS OpenGL ES 調節圖像色度 GPUImageHueFilter
  18. IOS OpenGL ES 指定顏色摳圖 GPUImageChromaKeyFilter
  19. IOS OpenGL ES 調節圖像白平衡/色溫 GPUImageWhiteBalanceFilter
  20. IOS OpenGL ES 設置圖像 lookup 濾鏡 GPUImageLookupFilter
  21. IOS OpenGL ES 設置圖像濾鏡 GPUImageAmatorkaFilter
  22. IOS OpenGL ES 設置圖像濾鏡 GPUImageSoftEleganceFilter
  23. IOS OpenGL ES 設置圖像銳化 GPUImageSharpenFilter
  24. IOS OpenGL ES 繪製十字 GPUImageCrosshairGenerator
  25. IOS OpenGL ES 繪製線條 GPUImageLineGenerator
  26. IOS OpenGL ES 設置圖像黑白燥點 GPUImageLocalBinaryPatternFilter
  27. IOS OpenGL ES 設置圖像卡通效果(黑色粗線描邊) GPUImageToonFilter
  28. IOS OpenGL ES 桑原濾波/水粉畫模糊效果 GPUImageKuwaharaFilter
  29. IOS OpenGL ES 黑白馬賽克效果 GPUImageMosaicFilter
  30. IOS OpenGL ES 像素化馬賽克效果 GPUImagePixellateFilter
  31. IOS OpenGL ES 同心圓像素化馬賽克效果 GPUImagePolarPixel
  32. IOS OpenGL ES 黑白網狀效果 GPUImageCrosshatchFilter
  33. IOS OpenGL ES 色彩丟失/模糊效果 GPUImageColorPackingFilter
  34. IOS OpenGL ES 圖像暈影 GPUImageVignetteFilter
  35. IOS OpenGL ES 圖像漩渦 GPUImageSwirlFilter
  36. IOS OpenGL ES 圖像魚眼擴散效果 GPUImageBulgeDistortionFilter
  37. IOS OpenGL ES 圖像魚眼移動效果 GPUImageBulgeDistortionFilter
  38. IOS OpenGL ES 圖像凹面鏡移動效果 GPUImagePinchDistortionFilter
  39. IOS OpenGL ES 圖像凹面鏡放大效果 GPUImagePinchDistortionFilter
  40. IOS OpenGL ES 圖像哈哈鏡效果 GPUImageStretchDistortionFilter
  41. IOS OpenGL ES 圖像水晶球效果 GPUImageGlassSphereFilter
  42. IOS OpenGL ES 圖像球形折射 GPUImageSphereRefractionFilter
  43. IOS OpenGL ES 圖像色調分離噪點效果 GPUImagePosterizeFilter
  44. IOS OpenGL ES 圖像 CGA 色彩濾鏡 GPUImageCGAColorspaceFilter
  45. IOS OpenGL ES 圖像柏林噪點/花邊噪點 GPUImagePerlinNoiseFilter
  46. IOS OpenGL ES 圖像加亮邊緣 GPUImage3x3ConvolutionFilter
  47. IOS OpenGL ES 圖像浮雕 3d 效果 GPUImageEmbossFilter
  48. IOS OpenGL ES 圖像馬賽克圓點 GPUImagePolkaDotFilter
  49. IOS OpenGL ES 圖像侵蝕邊緣黑白模糊 GPUImageErosionFilter
  50. IOS OpenGL ES 圖像侵蝕邊緣色彩模糊 GPUImageRGBErosionFilter
  51. IOS OpenGL ES 圖像擴展邊緣黑白模糊 GPUImageDilationFilter
  52. IOS OpenGL ES 圖像擴展邊緣彩色模糊 GPUImageRGBDilationFilter
  53. IOS OpenGL ES GPUImage 黑白色調模糊 GPUImageOpeningFilter
  54. IOS OpenGL ES GPUImage 彩色模糊 GPUImageRGBOpeningFilter
  55. IOS OpenGL ES GPUImage 圖像黑白色調模糊/暗色提亮 GPUImageClosingFilter
  56. IOS OpenGL ES GPUImage 圖像彩色調模糊/暗色提亮 GPUImageRGBClosingFilter
  57. IOS OpenGL ES GPUImage 圖像 Lanczos 重取樣模糊效果 GPUImageLanczosResamplingFilter
  58. IOS OpenGL ES GPUImage 圖像顯示亮度最高的像素,其他為黑 GPUImageNonMaximumSuppressionFilter
  59. IOS OpenGL ES GPUImage 圖像顯示亮度最高的像素,其他為黑 GPUImageThresholdedNonMaximumSuppressionFilter
  60. IOS OpenGL ES GPUImage 圖像 Sobel 邊緣檢測,類似漫畫反色 GPUImageSobelEdgeDetectionFilter
  61. IOS OpenGL ES GPUImage GPUImageWeakPixelInclusionFilter
  62. IOS OpenGL ES GPUImage GPUImageDirectionalNonMaximumSuppressionFilter
  63. IOS OpenGL ES GPUImage 圖像閾值邊緣檢測 GPUImageThresholdEdgeDetectionFilter

本文由博客 - 猿說編程 猿說編程 發佈!


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 對於拓展運算符是深拷貝還是淺拷貝網上怎麼說的都有,我就說一下我的理解。 什麼是深拷貝?什麼是淺拷貝? 假如B複製了A,修改A的時候,看B是否發生變化: 如果B也跟著變了,說明是淺拷貝,拿別人手段! 如果B沒有改變,說明是深拷貝,自食其力! 怎麼判斷拓展運算符是什麼拷貝呢? 看一下下麵的例子: let ...
  • 第一種:在main.js中直接註冊 //引入 import FixedTop from '@/components/FixedTop //註冊為全局組件 Vue.componet('FixedTop',FixedTop) //頁面直接使用 <FixedTop /> 缺點:如果我們需要註冊的全局組件非 ...
  • vue 組件通信方式 父組件將自己的狀態分享給子組件使用; 方法:父組件通過子標簽傳遞數據,子組件通過 props 接收 子組件改變父組件的狀態; 方法:父組件在子標簽上通過@abc 提供一個改變自身狀態的方法,子組件通過$emit("abc", payload)觸發這個函數 父組件直接改變子組件的 ...
  • 記錄下項目中使用的新方法,之前只知道改變show屬性來改變實體的顯示和隱藏,昨天遇到要動態綁定顯隱屬性。查找方法後找到了需要使用 cesium的SampledProperty這個方法。 下麵是簡單的代碼展示 let showProperty = new Cesium.SampledProperty( ...
  • 說明:這裡的vue代理是指用vue靜態伺服器做代理。使用的是 http-proxy-middleware 這個模塊(這個模塊相當於是node.js的一個插件)。 版本: vue-cli 3.0以上 修改文件位置:根目錄下的vue.config.js 代碼: devServer: { proxy: { ...
  • // js console console.clear(); console.log("console.log,show message, last recommand is console.clear"); console.info("console.info,other name for con ...
  • 作為一個開發人員,都想寫出一手好的代碼,而不是別人稱的“屎山”,設計模式提供了一系列常見問題的解決方案,通過利用設計模式來儘可能統一規範,可以提高代碼的可維護性、可讀性、可擴展性。 ...
  • 更多精彩內容,歡迎關註公眾號:邏魔代碼 前言 用了多年的 MacOS 做開發,一系列諸如 Alfred、Item2、Oh-my-zsh 之類的工具,大大地提升了工作的效率和使用舒適度。新工作不給配 Mac 電腦,自己帶電腦每天背著實在麻煩,就花時間研究了下如何在 Windows 上配置一個高效的開發 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...