C#數據結構與算法系列(十):逆波蘭計算器——逆波蘭表達式(後綴表達式)

1.介紹

後綴表達式又稱逆波蘭表達式,與前綴表達式相似,只是運算符位於操作數之後

2.舉例說明

(3+4)*5-6對應的後綴表達式就是3 4 +5 * 6 –

3.示例

輸入一個逆波蘭表達式(後綴表達式),使用棧(Stack),計算其結果

思路分析:

從左至右掃描表達式,遇到数字時,將数字壓入堆棧,遇到運算符時,彈出棧頂的兩個數,用運算符對它們做相應的計算(次頂元素 和 棧頂元素),並將結果入棧;

重複上述過程直到表達式最右端,最後運算得出的值即為表達式的結果例如: (3+4)×5-6 對應的後綴表達式就是 3 4 + 5 × 6 – , 

針對後綴表達式求值步驟如下:

從左至右掃描,將3和4壓入堆棧;
遇到+運算符,因此彈出4和3(4為棧頂元素,3為次頂元素),計算出3+4的值,得7,再將7入棧;
將5入棧;
接下來是×運算符,因此彈出5和7,計算出7×5=35,將35入棧;
將6入棧;
最後是-運算符,計算出35-6的值,即29,由此得出最終結果

代碼實現:

using System;
using System.Collections.Generic;
using System.Text.RegularExpressions;

namespace DataStructure
{
    public class PolandNotation
    {
        public static void Test()
        {
            try
            {
                //定義逆波蘭表達式
                string suffixExpression = "3 4 + 5 * 6 -";

                //將suffixExpression轉換成鏈表的方式
                var list = GetListString(suffixExpression);

                //輸出結果
                var result = Calculate(list);

                Console.WriteLine($"{suffixExpression}的結果是{result}");
            }
            catch (Exception ex)
            {
                Console.WriteLine(ex.Message);
            }
           
        }
        /// <summary>
        /// 獲取集合
        /// </summary>
        /// <param name="suffixExpression"></param>
        /// <returns></returns>
        public static List<string> GetListString(string suffixExpression)
        {
            //首先實例化List
            List<string> list = new List<string>();

            //將字符串通過空格切換成數組
            string[] split=suffixExpression.Split(" ");

            //循環添加
            foreach (var item in split)
            {
                list.Add(item);
            }

            return list;
        }

        /// <summary>
        /// 計算
        /// </summary>
        /// <param name="list"></param>
        /// <returns></returns>
        public static int Calculate(List<string> list)
        {
            //創建棧
            Stack<string> stack = new Stack<string>();

            //循環遍歷
            list.ForEach(item =>
            {
                //正則表達式判斷是否是数字,匹配的是多位數
                if (Regex.IsMatch(item,"\\d+"))
                {
                    //如果是数字直接入棧
                    stack.Push(item);
                }
                //如果是操作符
                else
                {
                    //出棧兩個数字,並運算,再入棧
                    int num1 =int.Parse(stack.Pop());

                    int num2 = int.Parse(stack.Pop());

                    int result = 0;

                    if(item.Equals("+"))
                    {
                        result = num2 + num1;
                    }
                    else if(item.Equals("*"))
                    {
                        result = num2 * num1;
                    }
                    else if(item.Equals("/"))
                    {
                        result = num2 / num1;
                    }
                    else if (item.Equals("-"))
                    {
                        result = num2 - num1;
                    }
                    else
                    {
                        throw new Exception("無法識別符號");
                    }

                    stack.Push(""+result);
                }
            });

            //最後把stack中數據返回
            return int.Parse(stack.Pop());
        }
    }
}

結果圖:

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

挖洞入門_union型SQL注入

簡介:在漏洞盒子挖洞已經有一段時間了,雖說還不是大佬,但技術也有所進步,安全行業就是這樣,只有自己動手去做,才能將理論的知識變為個人的經驗。本篇文章打算分享一下我在挖union型SQL注入漏洞過程中的一些個人理解,如有不足也請大佬不吝指教。

0x00:什麼是SQL注入

SQL注入,相信大多數人一開始接觸安全,聽說的第一種漏洞類型就會是SQL注入,眾所周知,其本質就是將用戶輸入的數據當成了SQL語句來執行

開發過網站的朋友應該都清楚,大多數的小型企業或個人的站點大都採用了LAMP結構,即Linux + Apache + MySQL + PHP,當然還有一些其它常見的技術如下錶:

操作系統 Web服務器 數據庫 編程語言
Linux Apache MySQL PHP
Windows Server Nginx Oracle JSP
Tomcat SQL Server ASP
Python

總的來說,絕大多數網站都採用了動態Web開發技術,而動態Web開發離不開數據庫,如果沒有處理好這兩者之間的關係,那麼SQL注入就會隨之而來了。

舉例來說,當我們想要通過參數id來獲取相對應的新聞時,整個過程簡單來說就是用戶通過URL請求新聞–>後台通過用戶請求去數據庫查詢相對應的新聞–>將查詢到的新聞回傳給用戶。在第二步查詢相對應的新聞時,後台會執行SQL語句來查詢,就像SELECT * FROM news WHERE id=''id的值是用戶來控制的,當id=1時,就會返回id=1的新聞,id=2時返回id=2的新聞,以此類推,就可以動態的控制web界面了。

這時,當用戶輸入的id值不正確時,後台就無法獲取相對應的新聞,前端就會沒有數據显示,可當用戶輸入的數據為1'; DROP TABLE news-- a時,恐怖的事情就發生了,數據庫中的news表被刪除了,這就說明這個參數存在SQL注入

回到剛才用戶輸入的數據,拼接到後台查詢數據時,整個SQL語句就變成了SELECT * FROM news WHERE id='1'; DROP TABLE news-- a',分析這條語句可知,用戶輸入的單引號閉合了id的值分號閉合了SELECT語句,然後又新建了一條DROP語句刪除了表news,最後的— a註釋掉了id值后的那個單引號,SQL注入就這麼產生了。

當一個站點存在SQL注入時用戶的輸入就可以傳入數據庫執行,理論上這樣可以獲得數據庫的全部數據,也就是常說的脫庫了。獲得數據的方法也多種多樣,可以通過頁面直接返回想要查詢的數據,也可以通過sleep延時函數猜測數據,都不行的話我們還可以使用DNS解析日誌來獲得數據。其中,最簡單的一種方法就是union型的SQL注入了。

union型SQL注入只是SQL注入的其中一種,也是最簡單的一種,對於這種漏洞的防範也特別簡單,可這種漏洞在互聯網中仍不計其數…這也可見全國乃至全球對於網絡安全知識普及的不足,接下來,我會從三個方面來講講這種漏洞,分別是為什麼會產生怎麼利用以及怎麼防範

0x01:為什麼會產生union型SQL注入

union型SQL注入,看名字就能知道,使用這種方法可以直接在頁面中返回我們要查詢的數據,方法也很簡單,即使用UNION聯合查詢即可。

但使用UNION聯合查詢時還要滿足一個條件,那就是我們構造的SELECT語句的字段數要和當前表的字段數相同才能聯合查詢,即首先我們要確定當前表的字段數。order by x是數據庫中的一個排序語句,order by 1即通過第一個字段進行排序。這時我們就可以構造SELECT * FROM news WHERE id='1' order by x-- a'來猜測當前表的字段數,x值遞增,當頁面返回數據異常時,即無當前字段時,用當前的x值減一即可得到當前表的字段數了。

知道了當前表的字段數,就可以進行UNION聯合查詢了。但聯合查詢時,頁面只會显示查詢到數據的第一條,也就是UNION前的SELECT語句的結果,想要显示我們自己聯合查詢的結果時,還必須使前一條語句失效,這裏我們構造and 1=2使前一句SELECT語句失效。回到剛才的案例,假設當前表的字段數為3,我們就可以構造SELECT * FROM news WHERE id='1' and 1=2 UNION SELECT 1,2,3-- a'來查詢當前頁面的顯錯點了,通過下圖的案例可知,當前的顯錯點為第一字段第三字段

這個顯錯點又是什麼意思呢?比如當前表中共有三個字段,一個是標題(title)、一個是時間(time)、一個是內容(data),而我們前端不需要显示時間,只需要展示標題和內容即可。那麼從數據庫獲得的數據中,也只有標題字段和內容字段會展示在頁面上,這兩個點就是顯錯點

通過這裏的顯錯點,用戶就可以獲得數據庫中的所有數據了。當用戶輸入的數據為1' and 1=2 UNION SELECT 1,2,database()-- a時,即SQL語句為SELECT * FROM news WHERE id='1' and 1=2 UNION SELECT 1,2,database()-- a'時,就可以直接得到數據庫的庫名

0x02:怎麼利用union型SQL注入

1.判斷是否存在注入

構造and 1=1/and 1=2查看頁面是否有異常,若有異常,即有可能存在注入,另外還可通過該語句判斷該站點是否有WAF,若有WAF的話會有攔截警告,當然,WAF也是可以繞過的。。。

2.查詢當前表的字段數

構造order by x,當頁面返回異常時,利用x減一即可得到當前表的字段數

3.查詢顯錯點

構造and 1=2 union select 1,2,3,若頁面显示了我們構造的1,2,3,則對應的字段即為顯錯點

4.查詢數據庫庫名

構造and 1=2 union select 1,2,database(),即可在顯錯點显示當前數據庫庫名

一般挖漏洞的話到此步驟就可以提交了,切記千萬不可非法獲得數據,挖洞有風險,同志需謹慎!

5.查詢數據庫中的表名

構造and 1=2 union select 1,2,table_name from information_schema.tables where table_schema=database() limit 0,1,即可在顯錯點显示當前庫中的表名,因為顯錯點一次只能显示一條數據,這時可以通過limit語句選擇不同的表名進行查看。

6.查詢選擇表中的字段名

構造and 1=2 union select 1,2,column_name from information_schema.columns where table_schema=database() and table_name='XXX' limit 0,1,即可在顯錯點显示字段名,這裏也是通過limit語句選擇不同的字段名進行查看。

7.查詢數據庫中的數據

構造and 1=2 union select 1,2,XXX from XXX limit 0,1,即可獲得數據庫中的數據了。

0x03:怎麼防範union型SQL注入

針對union型SQL注入,我們可以對用戶輸入的數據進行一次篩查,設置黑名單,攔截注入常用的一些關鍵詞,比如andorder byunionselectfrom等。

除了設置黑名單外,還有一種比較靠譜的方法,即使用預編譯語句,而不是動態的生成SQL語句,這樣可以有效的避免用戶輸入的數據連接到數據庫執行,就是實現起來比較複雜,需要設置大量的預編譯語句。

另外還有一種目前最靠譜的方法,實現起來還簡單,就是上硬件防火牆。。。就是有點小貴。

0x04:互聯網中的一些案例

依據網絡安全法,本文旨在分享個人學習經驗,內容禁止用於違法犯罪行為!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

RocketMQ(1)—架構原理及環境搭建

一、架構簡述

RocketMQ阿里開源的一個分佈式消息傳遞和流媒體平台,具有低延遲,高性能和可靠性, 萬億級容量和靈活的可伸縮性。跟其它中間件相比,RocketMQ的特點是JAVA實現,在發生宕機和其它故障時消息丟失率更低

它由四個部分組成:nameserver,broker,生產者和消費者。它們中的每一個都可以水平擴展,而沒有單個故障點。  

Nameserver:提供輕量級的服務發現和路由。生產者和消費者通過nameserver獲取broker信息。它幾乎是無狀態的,nameserver結點之間沒有任何的數據同步,broker註冊信息時會註冊到每一個nameserver結點上面,所以每個nameserver節點都記錄了完整broker信息,提供相應的讀寫服務,並支持快速的存儲擴展。

Broker:通過提供輕量級的topic和queue機制來存儲消息。與nameserver中的每個節點建立長連接,定時註冊topic等信息到nameserver上面。broker一般都是主從模式,因為消息是真實存儲消息的地方,避免一個結點掛了,導致這個節點數據全部丟失。

Producer:與nameserver集群中的一個結點建立長連接,定期的拉取broker 的topic路由信息,再將消息發送到對應broker的topic上面

Consumer:與nameserver集群中的一個結點建立長連接,定期的拉取broker 的topic路由信息,再去消費對應broker的topic信息

 

 

二、環境搭建

 1.官網下載:http://rocketmq.apache.org/release_notes/release-notes-4.7.0/

2.解壓 unzip rocketmq-all-4.7.0-bin-release.zip

3.修改啟動參數配置。默認的jvm參數內存設置特別大,如果自己機器不行的話需要手動改下bin目錄下的啟動參數文件:runbroker.sh 和runserver.sh文件 我的虛擬機內存分配不大,改成256m 256m 128m

   這是默認的

 

 

4.啟動nameserver: nohup sh mqnamesrv ‐n 192.168.0.67:9876 &   (將日誌輸出當前目錄的nohub.out文件,方便查看啟動日誌,ip是當前機器的ip)

 

 

 

 5.啟動broker:nohup sh mqbroker ‐n 192.168.0.67:9876 autoCreateTopicEnable=true &  (autoCreateTopicEnable=true 自動創建topic,如果不設置true的話,生產者發送消息的時候如果沒有topic就會發送失敗,需要提前把topic創建好,設置true會在發送時自動創建topic,192.168.0.67:9876 是name server)

也可以使用配置文件啟動broker:nohup sh mqbroker ‐n 192.168.0.67:9876 ‐c conf/broker.conf &

簡單看下默認的配置文件中的一些參數:

#集群名字
brokerClusterName = DefaultCluster
#broker名字,集群中主從都要用這個名字,才會組成一個集群
brokerName = broker-a
#id為0的是master  非0的slava
brokerId = 0
#消息處理時間,凌晨4點
deleteWhen = 04
#消息保存時間默認48小時,48小時之後的凌晨4點就會清理
fileReservedTime = 48
#集群主從之間數據同步方式 
#異步只需要發到master成功就返回客戶端段成功,性能高,但是如果master掛了 slave還未同步就會丟失消息。根據自身業務場景選擇合適方式
brokerRole = ASYNC_MASTER
#消息刷盤機制,和主從數據同步類似,同步就是說需要寫進磁盤了才返回成功。異步就是寫進內存了就返回成功,後面再去落盤。
flushDiskType = ASYNC_FLUSH
#自動創建topic
autoCreateTopicEnable=true

使用配置文件啟動:nohup sh bin/mqbroker ‐n 192.168.0.67:9876 -c conf/broker.conf &

broker 192.168.0.67:10911關聯的nameserver是192.168.0.67:9876

 

 

至此一個單機的rocketMQ的環境就搭建好了   正常退出: sh mqshutdown broker  和  sh mqshutdown namesrv

 

測試下消息發送,使用rocketMQ提供的測試腳本:

export NAMESRV_ADDR=192.168.0.67:9876

生產者腳本

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Producer 消費者腳本

sh bin/tools.sh org.apache.rocketmq.example.quickstart.Consumer 發送消息:  

 

 消費消息:

 

三、控制台搭建

1.下載rocketMQ的擴展包,master分支:https://github.com/apache/rocketmq-external 

 2.啟動rocketmq-console-ng模塊

 

 3.修改此模塊配置:

  3.1 maven依賴rocketMQ版本改成自己部署版本對應的,我部署的MQ是最新的4.7.0版本

 

 

  3.2 配置文件中配置namserver地址和控制台數據存放地址

 

 正常來說改完這兩個地方就可以直接啟動控制台的這個springboot程序了。

但是因為我用的MQ是最新的4.7版本,控制台對應的還沒有更新到最新的。編譯都有會報錯的地方

1.DefaultMQPullConsumer這個類已經不推薦使用了,並且4.7.0中有兩個類似的構造器,原來代碼直接傳了一個null,第二個參數無法識別是哪個構造器的。修改下把第二參數強轉String或者RPCHook

 

 

2.MQAdminExt這個接口中加了新方法,但是控制台中MQAdminExtImpl還沒有實現對應的方法。這個問題在github上幾天前已經有人提了Issues了,我這裡是自己添加一下默認實現然後服務就可以正常啟動了,還不確定後續後面有什麼影響沒有,至少可以啟動了

 

 

 

 

之前使用測試腳本發送的消息 以及topic都可以在控制台看到了

 

 

 

 

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

接口中的默認方法與靜態方法

在Java8之前的版本中,接口中只能聲明常量和抽象方法,接口的實現類中必須實現接口中所有的抽象方法。而在Java8中,接口中可以聲明默認方法靜態方法。

接口中的默認方法

Java 8中允許接口中包含具有具體實現的方法,該方法稱為“默認方法”,默認方法使用“ default ”關鍵字修飾 。

示例:

public interface MyInterface {
    default String getMsg(String srcMsg){
        return "======"+srcMsg;
    }
}

接口中的默認方法,有一個“類優先”原則:

若一個接口中定義了一個默認方法,而另外一個父類或接口中又定義了同一個同名的方法時:

  • 選擇父類中的方法。如果一個父類提供了具體的實現,那麼接口中具有相同名稱的參數的默認方法會被忽略。
  • 接口衝突。如果一個父接口提供一個默認方法,而另一個接口中也提供了一個具有相同名稱和參數列表的方法(不管方法是否是默認方法),那麼必須覆蓋該方法來解決衝突。

示例1:

public interface MyInterface1 {
    default String getMsg(String srcMsg){
        return "===我是MyInterface1111111==="+srcMsg;
    }
}
///////////////////////////////////////////////////////
public class MyClass1 {
    public String getMsg(String srcMsg){
        return "===我是MyClass11111==="+srcMsg;
    }
}
///////////////////////////////////////////////////////
public class MySubClass1 extends MyClass1 implements MyInterface1 {
}

///////////////////////////////////////////////////////
public class InterfaceTest {

    public static void main(String[] args) {
        MySubClass1 ms1 = new MySubClass1();

        String srcMsg = "Java 牛逼!!";
        //MySubClass1 類繼承了 MyClass1 類,實現了MyInterface1 接口,根據類優先原則,調用同名方法時,會忽略掉接口 MyInterface1 中的默認方法。
        System.out.println(ms1.getMsg(srcMsg));//輸出結果:===我是MyClass11111===Java 牛逼!!

    }
}

示例2:

public interface MyInterface2 {
    default String getMsg(String srcMsg){
        return "===我是MyInterface2222222==="+srcMsg;
    }
}
////////////////////////////////////////////////////////////////
public class MySubClass2 implements MyInterface1,MyInterface2 {
    @Override
    public String getMsg(String srcMsg) {
        //同時實現了 MyInterface1,MyInterface2  接口,根據 類優先 原則,兩個父接口中都提供了相同的方法,那麼子類中就必須重寫這個方法來解決衝突。
        return MyInterface1.super.getMsg(srcMsg);
        //return MyInterface2.super.getMsg(srcMsg);
        //return "------"+srcMsg;
    }
}
////////////////////////////////////////////////////////////////
public class InterfaceTest {

    public static void main(String[] args) {
        MySubClass2 ms2 = new MySubClass2();

        //MySubClass2 重新實現了兩個父接口中都存在的相同名稱的方法。
        System.out.println(ms2.getMsg(srcMsg));//輸出結果:===我是MyInterface1111111===Java 牛逼!!
    }
}

 

接口中的靜態方法

在Java8中,接口中允許添加 靜態方法,使用方式:“接口名.方法名”

示例:

public interface MyInterface3 {
    static String getMsg(String msg){
        return "我是接口中的靜態方法:"+msg;
    }

    static void main(String[] args) {
        System.out.println(MyInterface3.getMsg("Java牛逼!!"));
    }
}

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?

磨皮美顏算法 附完整C代碼

前言

2017年底時候寫了這篇《集 降噪 美顏 虛化 增強 為一體的極速圖像潤色算法 附Demo程序

這也算是學習過程中比較有成就感的一個算法。

自2015年做算法開始到今天,還有個把月,就滿五年了。

歲月匆匆,人生能有多少個五年。

這五年裡,從音頻圖像到視頻,從傳統算法到深度學習,從2D到3D各種算法幾乎都走了一個遍。

好在,不論在哪個領域都能有些許建樹,這是博主我自身很欣慰的事情。

雖然有所間斷但是仍然堅持寫博客,並且堅持完整開源分享。

目的就是為了幫助那些一開始跟我一樣,想要學習算法的萌新,

一起踏入算法領域去跟大家“排排坐,吃果果”。

引子

在這個特別的時間點,就想做點特別的事情。

那就是開源當時寫的這個“美顏算法”,開源代碼和當時的版本有些許出入,但是思路是一樣的。

早些年的時候大家發現採用保邊濾波的思路可以做到降噪,進而衍生出來針對皮膚的降噪,簡稱磨皮或者美顏。

從此百家爭鳴,而這個課題到今天也還在發展,當然日新月異了。

故此,想談談針對美顏磨皮的一些算法思路,為後續想學習並改進的萌新提供一些養分。

概述美顏磨皮方法

1.基於保邊降噪

這類算法有很多方法,但不外乎2種基礎思路,

基於空間和基於頻率,當然再展開的話,還可以細分為紋理和顏色。

例如通過膚色或紋理區域做針對性的處理。

這類算法的優點是計算簡單,通用型強,但缺點就是不夠細膩完美。

2.基於人臉檢測貼圖

這種嚴格意義上來說,是易容術,就是基於人臉檢測出的關鍵數據。

例如人臉關鍵點,將人臉皮膚區域提取出來,重新貼上一張事先準備的皮膚圖,進行皮膚貼合融合。

臉已經被置換了,效果很贊。有點繆修斯之船的味道。

這類算法優點是效果極其驚艷,但是算法複雜通用性差,一般只能針對少數角度表情的人臉。

3.結合1和2的深度學習方法

前兩者的思路早期大行其道,如今到了數據時代,

基於深度學習的工具方案,可以非常好地結合前兩者的思路,進行訓練,求一個數據解。

很多人將深度學習等同於AI,這個做法有點激進。

基於深度學習的做法,仍然存在前兩者一樣的問題,簡單的不夠細膩,細膩的不夠簡單,

而如果要設計一個優秀的模型,其實跟設計一個傳統算法一樣困難。

基於數據驅動的算法,驗證成本非常高,可控性比較差,當然在金錢的驅動下確實能產出還不錯的算法模型。

這類算法的優點,往往能求出很不錯的局部最優解,甚至以假亂真,缺點就是需要大量金錢和數據的驅動。

總結來說的話,不付出代價,就別想有好的結果,非常的現實。

 

據我所知目前使用最多的方案是第一種和第三種,第二種可操作性不強,只有少數公司掌握了這方面的核心技術。

但是不管是哪種方案,無非就是以下幾個步驟。

1.確定人臉的皮膚區域

2.定位人臉的雜質(痘痘,斑點,痣,膚色不均等)

3.根據定位到雜質進行填補修復或濾除

 

這就是圖像處理經典三部曲

1.定位 2.檢測 3.處理

每一個細分展開,都非常宏大且複雜的算法。

 

以上,僅以磨皮美顏為例子,闡述圖像方面的算法想要或正在解決什麼樣的問題。

我們在工作中碰到的圖像問題無非以上幾個核心問題,問題都是類似的,只是不同場景和需求下各有難處。

本次開源的算法思路

本次開源的算法是基於保邊降噪的思路,

當然這個思路可以通過改寫,參數化后可以集成到深度學習中,作為一個先驗層輔助訓練。

算法步驟如下:

1.  檢測皮膚顏色,確定皮膚占圖像的比率

2. 根據皮膚比率進行邊緣檢測,產出細節映射圖

3. 基於細節映射圖和磨皮強度進行保邊降噪

4. 對降噪好的圖進行再一次膚色檢測,保留膚色區域的降噪,其他區域還原為原圖

步驟比較簡單,但是要同時兼顧效果性能,是很不容易的。

當然這個算法膚色檢測那一部分可以採用深度學習“語義分割”方面的思路進而改進效果。

做得好,將本算法改良到准商用,驚艷的程度是沒有問題的。

深度學習相關技術就不展開細說了,有能力的朋友,感興趣的話,可以自行實操。

 

完整源代碼開源地址:

https://github.com/cpuimage/skin_smoothing

項目沒有第三方依賴,完整純c代碼。

有編譯問題的同學自行參考《Windows下C,C++開發環境搭建指南》搭建編譯環境。

附上算法效果的示例:

 

 

以上,權當拋磚引玉之用。

授人以魚不如授人以漁。

 

2020年,疫情之下,

願大家都能事業有成,身體健康。

世界和平,人們皆友愛。

 

若有其他相關問題或者需求也可以郵件聯繫俺探討。

郵箱地址是: gaozhihan@vip.qq.com

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※想知道最厲害的網頁設計公司"嚨底家"!

※幫你省時又省力,新北清潔一流服務好口碑

※別再煩惱如何寫文案,掌握八大原則!

※產品缺大量曝光嗎?你需要的是一流包裝設計!

全球再生能源發電總量 5年內有望增長5成

摘錄自2019年10月21日自由時報報導

國際能源署(IEA)針對全球可再生能源市場進行2019年至2024年的分析與預測,21日發布《2019年可再生能源》(Renewables 2019)年度報告。報告預估,全球可再生能源的發電總量,未來5年內可提升50%,相當於增加1200吉瓦(GW);可再生能源的發電佔比將從目前的26%提升到30%。

報告指出,可再生能源中預估成長最快速的是太陽能,其發電量未來5年內約可增加600吉瓦,且發電成本可降低15%至35%;屋頂太陽能系統的數量未來5年內有望增加逾一倍,達到1億座。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※教你寫出一流的銷售文案?

非洲豬瘟疫情防控 南韓今年確診11起

摘錄自2020年01月12日中央通訊社南韓報導

南韓環境部和國立環境科學院今天(12日)表示,自去年10月3日首次確診以來,截至10日共有66起確診感染非洲豬瘟(ASF)病毒,僅今年就有11起確診,疫情防控上仍有很大挑戰。

南韓聯合新聞通訊社報導,去年10月(18起)、11月(15起)、12月(22起)平均每天有0.5~0.7起確診,但今年以來每天發現1起以上感染死豬。江原道華川地區最近首次發現感染非洲豬瘟的野豬屍體。

之前僅在京畿道漣川(26起)、坡州(22起)、江原道鐵原(17起)發現感染非洲豬瘟的野豬屍體,此次擴散到華川。

報導說,政府9日召開會議檢討非洲豬瘟疫情應對情況。雖然確診疫情數在增加,但政府官員認為,這是防疫過程中的自然現象。不過由於家豬傳播非洲豬瘟病毒的可能性沒有完全消失,將繼續加強防疫監管。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

※台北網頁設計公司全省服務真心推薦

※想知道最厲害的網頁設計公司"嚨底家"!

新北清潔公司,居家、辦公、裝潢細清專業服務

※推薦評價好的iphone維修中心

貝斯女王島走出油污陰霾 褐鵜鶘庇護區揭牌

摘錄自2020年3月3日公視報導

美國路易斯安那州的貝斯女王島,是褐鵜鶘主要的棲地,過去因為遭到漏油事件重創,環境危害嚴重。不過在肇事的英國石油公司賠償下,將擴建庇護區。

路易斯安那州官員為重建的水鳥庇護區揭牌同時表示,過去人類對牠們棲地所造成的傷害長達10年,現在要還給牠們更乾淨、更安全的家。各界也希望今年夏天,貝斯女王島能跟往年一樣有約6500隻褐鵜鶘,以及約3000隻較小的水鳥遷徙到這裡築巢。

2010年墨西哥灣漏油事件,造成11人死亡,87天內超過1億加侖的原油洩漏。當時貝斯女王島72公里海岸線布滿油汙,褐鵜鶘全身浸泡在黑色汙泥的景象極為駭人,島上許多植物被遭毀,造成的生態浩劫引發全球擔憂。肇事的英國石油公司賠償200億美元,其中部分金額用來擴建養護1700公頃的海岸跟小島,今年還將投入8億美元持續重建工程。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※想知道購買電動車哪裡補助最多?台中電動車補助資訊懶人包彙整

南投搬家公司費用,距離,噸數怎麼算?達人教你簡易估價知識!

※教你寫出一流的銷售文案?

※超省錢租車方案

專家針對武漢肺炎警告 都市人長期處於空污下 恐增加感染死亡風險

環境資訊中心綜合外電;姜唯 編譯;林大利 審校

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計一頭霧水該從何著手呢? 台北網頁設計公司幫您輕鬆架站!

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※Google地圖已可更新顯示潭子電動車充電站設置地點!!

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※別再煩惱如何寫文案,掌握八大原則!

網頁設計最專業,超強功能平台可客製化

Dell 將於 2040 年全面轉用再生能源

摘錄自2019年11月13日unwire HK報導

隨著更多的企業響應環保,作為知名的電腦公司 DELL 在近日亦宣佈了新的可持續發展計劃,指公司所有設施的 75% 電力將會使用可再生能源,直至 2040 年時將預計可獲 100% 的電力,並同時在計劃在過程中提高公司在生產及供應鏈上的能源效益,以達致低排放的目標為環保出一分力。

DELL 在早前宣佈公司將進行「Progress Made Real」的計劃,計劃內容主要包括在消費者購買的每一項設備時會回收同一污染水平的產品,以及在生產電力方面採用可再生能源。DELL 指出到 2030 年時公司一半以上的設備將會由回收材料或可再生物料而生產,在包裝上則會全面使用可重覆利用的物料。

不過 DELL 就並未透露公司是否會增加旗下所有裝置的使用壽命,但就指出對電子製造商而言,應對氣候變化的最佳方法是避免所有電子產品送往堆填區,而是重覆使用及物盡其用。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

網頁設計公司推薦不同的風格,搶佔消費者視覺第一線

※廣告預算用在刀口上,台北網頁設計公司幫您達到更多曝光效益

※自行創業缺乏曝光? 網頁設計幫您第一時間規劃公司的形象門面

南投搬家公司費用需注意的眉眉角角,別等搬了再說!

新北清潔公司,居家、辦公、裝潢細清專業服務

※教你寫出一流的銷售文案?