目前分類:影像處理類 (10)

瀏覽方式: 標題列表 簡短摘要

引用:
http://blog.csdn.net/fengbingchun/article/details/5935205



最大类间方差法是由日本学者大津于1979年提出的,是一种自适应的阈值确定的方法,又叫大津
法,简称OTSU。它是按图像的灰度特性,将图像分成背景和目标2部分。背景和目标之间的类间方差
越大,说明构成图像的2部分的差别越大,当部分目标错分为背景或部分背景错分为目标都会导致2部
分差别变小。因此,使类间方差最大的分割意味着错分概率最小。
对于图像I(x,y),前景(即目标)和背景的分割阈值记作T,属于前景的像素点数占整幅图像的比
例记为ω0,其平均灰度μ0;背景像素点数占整幅图像的比例为ω1,其平均灰度为μ1。图像的总平均
灰度记为μ,类间方差记为g。
假设图像的背景较暗,并且图像的大小为M×N,
图像中像素的灰度值小于阈值T的像素个数记作N0,像素灰度大于阈值T的像素个数记作N1,则有:
      ω0=N0/ M×N (1)
      ω1=N1/ M×N (2)
      N0+N1=M×N (3)
      ω0+ω1=1 (4)
      μ=ω0*μ0+ω1*μ1 (5)
      g=ω0(μ0-μ)^2+ω1(μ1-μ)^2 (6)
将式(5)代入式(6),得到等价公式: g=ω0ω1(μ0-μ1)^2 (7)
采用遍历的方法得到使类间方差最大的阈值T,即为所求。

prague12 發表在 痞客邦 留言(0) 人氣()

前後景分離模型方法
http://vbie.eic.nctu.edu.tw/technical.php?index=58
LBP 說明
http://blog.finalevil.com/2008/12/01-local-binary-patternlbp-histogram.html
http://blog.csdn.net/wangweitingaabbcc/article/details/6618583

prague12 發表在 痞客邦 留言(0) 人氣()

區域生長演算法 使用stack
VB9
by JK

'------------------------------------

Imports System.IO
Imports System.Collections

Public Class Form3
Dim pic_path As String = ""
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Button1.ForeColor = Color.Red
Application.DoEvents()
If pic_path = "" Then
If OpenFileDialog1.ShowDialog() = Windows.Forms.DialogResult.OK Then
pic_path = OpenFileDialog1.FileName
End If

End If
'Dim b_new As New IO.FileStream(pic_path, IO.FileMode.Append)
'Dim rd_b As New BinaryReader(b_new)
'Dim data=

' 二進位讀取器()
Dim photo As Byte()
Dim nn = 0, i = 0
Dim appearPosition(100) As Integer


Dim N = 256
photo = My.Computer.FileSystem.ReadAllBytes(pic_path)
Dim photo_2D(N - 1, N - 1) As Byte

For j = 0 To N - 1
For i = 0 To N - 1
Dim v = photo(j * 256 + i)
photo_2D(i, j) = v

Next
Next




Dim row_i = CInt(TextBox_x.Text)
Dim column_i = CInt(TextBox_y.Text)
'-----------局域生長-------------
Dim stack_temp As New Stack(Of UInt16)
Dim stack_Area As New Stack(Of UInt32)
Dim seed_ini = 256 * column_i + row_i

Dim seed = seed_ini
search4direction(seed, photo, photo_2D, stack_temp, stack_Area)
While stack_temp.Count 0
Dim new_point = stack_temp.Pop
seed = new_point
' MsgBox(new_point.ToString)
search4direction(seed, photo, photo_2D, stack_temp, stack_Area)

End While


'-----------/局域生長/-------------






'--------輸出成圖檔--------------------------
Dim pic_grow As New Bitmap(256, 256)
Dim pic_gray As New Bitmap(256, 256)

For j = 0 To N - 1
For i = 0 To N - 1
If (j * 256 + i) = seed_ini Then
pic_gray.SetPixel(i + 1, j, Color.FromArgb(255, 0, 0))
pic_gray.SetPixel(i - 1, j, Color.FromArgb(255, 0, 0))
pic_gray.SetPixel(i, j + 1, Color.FromArgb(255, 0, 0))
pic_gray.SetPixel(i, j - 1, Color.FromArgb(255, 0, 0))
Else
Dim v = photo_2D(i, j)
pic_gray.SetPixel(i, j, Color.FromArgb(v, v, v))
pic_grow.SetPixel(i, j, Color.FromArgb(v, v, v))

End If
Next
Next



Dim Ns = 256
While stack_Area.Count > 0
Dim position = stack_Area.Pop
Dim pos_i = position Mod N
Dim pos_j = position \ N

pic_grow.SetPixel(pos_i, pos_j, Color.FromArgb(255, 0, 0))
End While

PictureBox1.Image = pic_grow
PictureBox2.Image = pic_gray
'---------/輸出成圖檔/-----------------------------

Button1.ForeColor = Color.Green
End Sub



Public Sub search4direction(ByVal seed As Integer, ByRef photo() As Byte, ByRef photo_2D(,) As Byte, ByRef stack_temp As Stack(Of UInt16), ByRef stack_Area As Stack(Of UInt32))
'-----------局域生長-------------


' Dim seed = 256 * 1 + 22
Dim N = 256


Dim v1_seed = photo(seed)
Dim seed_i = seed Mod N
Dim seed_j = seed \ N
Dim v2_seed As Integer = photo_2D(seed_i, seed_j) '相當於 v1_seed
Dim err = CInt(TextBox_err.Text)

If seed_i 0 And seed_j 0 Then
'------檢查上下左右--------------------
Dim v_up As Integer = photo_2D(seed_i, seed_j + 1)
Dim new_index = (seed_j + 1) * N + seed_i

If Not stack_Area.Contains(new_index) Then ' 只處理在紀錄本裡沒有的點

If CInt(v_up - v2_seed) stack_Area.Push(new_index) '紀錄生長位置 ' 紀錄本存下新的點
stack_temp.Push(new_index) '紀錄當次點
End If
End If


Dim v_right As Integer = photo_2D(seed_i + 1, seed_j)
new_index = (seed_j) * N + (seed_i + 1)
If Not stack_Area.Contains(new_index) Then ' 只處理在紀錄本裡沒有的點
If (v_right - v2_seed) stack_Area.Push(new_index) '紀錄生長位置 ' 紀錄本存下新的點
stack_temp.Push(new_index) '紀錄當次點
End If
End If


Dim v_down As Integer = photo_2D(seed_i, seed_j - 1)
new_index = (seed_j - 1) * N + (seed_i)
If Not stack_Area.Contains(new_index) Then ' 只處理在紀錄本裡沒有的點
If (v_down - v2_seed) stack_Area.Push(new_index) '紀錄生長位置 ' 紀錄本存下新的點
stack_temp.Push(new_index) '紀錄當次點
End If
End If

Dim v_left As Integer = photo_2D(seed_i - 1, seed_j)
new_index = (seed_j) * N + (seed_i - 1)
If Not stack_Area.Contains(new_index) Then ' 只處理在紀錄本裡沒有的點
If (v_left - v2_seed) stack_Area.Push(new_index) '紀錄生長位置 ' 紀錄本存下新的點
stack_temp.Push(new_index) '紀錄當次點
End If
End If
'------/檢查上下左右/--------------------
End If






'-----------/局域生長/-------------
End Sub


End Class

prague12 發表在 痞客邦 留言(0) 人氣()

區域生長演算法 C 語言版 使用stack
適用圖片大小 256 X 256
by JK
//------------------------------

// Area_grow.cpp : 定義主控台應用程式的進入點。
//

#include "stdafx.h"

#include
#include
#include
#include

#define width 256
#define height 256
using namespace std;



int AreaArray[width*height] ;

//---------------------------
//bool searchArray(int *Array ,int searchValue )
// 陣列搜索
//return 0 ; 沒有找到
//-----------------------
bool searchArray(int *Array ,int searchValue )
{

for (int i=0;i {
int temp= Array[i];
if (temp!=NULL)
{
if (temp==searchValue)
{
return 1 ;
}

//char str[10];
//itoa(temp,str,10);
//printf(str);

}
}

return 0 ; //沒有找到
}
//-------------------------------------
typedef unsigned char byte;
int A_i =0;
void search4direction(int seed , byte *photo , stack *stack_temp , int* stack_Area )
{
//-----------局域生長-------------



int N = 256 ;


int v1_seed = photo[seed] ;
int seed_i = seed % N ;
int seed_j = seed / N ;
int err = 3;

if( (seed_i 0) && (seed_j 0) )
{
// '------檢查上下左右--------------------

int new_index = (seed_j + 1) * N + seed_i;
int v_up = photo[new_index ];

if( ! searchArray(AreaArray,new_index) ) // ' 只處理在紀錄本裡沒有的點
{
if ((v_up - v1_seed) {
AreaArray[A_i] =new_index ;// '紀錄生長位置 ' 紀錄本存下新的點
A_i++;
stack_temp->push (new_index);// '紀錄當次點
}
}

//---------------------

new_index = (seed_j ) * N + seed_i+1;
int v_right = photo[new_index ];

if( ! searchArray(AreaArray,new_index) ) // ' 只處理在紀錄本裡沒有的點
{
if ((v_right - v1_seed) {
AreaArray[A_i] =new_index ;// '紀錄生長位置 ' 紀錄本存下新的點
A_i++;
stack_temp->push (new_index);// '紀錄當次點
}
}

//------------------------------

//---------------------

new_index = (seed_j-1 ) * N + seed_i;
int v_down = photo[new_index ];

if( ! searchArray(AreaArray,new_index) ) // ' 只處理在紀錄本裡沒有的點
{
if ((v_down - v1_seed) {
AreaArray[A_i] =new_index ;// '紀錄生長位置 ' 紀錄本存下新的點
A_i++;
stack_temp->push (new_index);// '紀錄當次點
}
}

//---------------------

new_index = (seed_j ) * N + seed_i-1;
int v_left = photo[new_index ];

if( ! searchArray(AreaArray,new_index) ) // ' 只處理在紀錄本裡沒有的點
{
if ((v_left - v1_seed) {
AreaArray[A_i] =new_index ;// '紀錄生長位置 ' 紀錄本存下新的點
A_i++;
stack_temp->push (new_index);// '紀錄當次點
}
}


// '------/檢查上下左右/--------------------
}

// '-----------/局域生長/-------------




} //end void search4directio



//===============================================

//主程式區

//===============================================


int _tmain(int argc, _TCHAR* argv[])
{
unsigned char *image;
FILE *fp,*fc;
image=new unsigned char[width*height];
// 讀檔
fp=fopen("lena.raw","rb");
fread(image,sizeof(unsigned char),width*height,fp);

//-------------------
int row_i = 200;
int column_i = 128;
// '-----------局域生長-------------
stack stack_temp;
int seed_ini = 256 * column_i + row_i;

int seed = seed_ini ;
search4direction(seed, image, &stack_temp, AreaArray);
while ( stack_temp.size () != 0)
{
int new_point = stack_temp.top();//複製頂端那個值
stack_temp.pop();//吐掉頂端那個

seed = new_point;
search4direction(seed, image, &stack_temp, AreaArray);
}
//'-----------/局域生長/-------------
//---------------




//------成長區域填色-------------

for(int i=0;i




















prague12 發表在 痞客邦 留言(0) 人氣()

卡曼濾波介紹
http://www.cnblogs.com/MobileBo/archive/2010/09/10/1823642.html


c# kalman
http://www.cnblogs.com/MobileBo/archive/2010/09/07/1820831.html

prague12 發表在 痞客邦 留言(0) 人氣()

JK 對PCA做的夢境分析2

參考:
http://blog.sina.com.cn/s/blog_794c88520100pwj2.html
http://www.shamoxia.com/html/y2011/2544.html

做夢都在分析PCA的維度空間...
在JK夢裡,不斷在PCA維度空間中轉換,有這麼一些體悟在於
PCA主成分分析最主要的概念在於自動的找出原始資料集裡的主成分軸的方向(1維),
隨後再將原始資料(比如2維)投影到主軸上成為1維資料,相對的也可以反轉換回來.只用一維的資料做反轉回2維會有較嚴重失真,(如果要減少失真,需要使用兩個主成分軸投影來反轉.)將二維的數據集變成一維的數據集,有降維度簡化數據的功能.但主要是根據降低相關性的概念在做數據轉換.在2D to 1D轉換過程中,會有很多原始點對應到了同一個轉換後的點 . (請思考在coding的時候,要如何對付這種多對一的狀況呢!!)

主軸投影軸也可以是二維的,兩主軸彼此正交,稱為第一主成份軸和第二主成分軸,
主軸向量是根據線性代數所找出的特徵值而來的,原始數據如果是二維度的,基本上特徵值也會有兩個.(一般只選第一個主軸來投影)此時,原始資料各對兩主軸分別投影,可以得到兩組投影量集合(二維),這相當於是數據做了座標軸旋轉的轉換,這個轉換結果會導致新的數據集(二維)在計算自變異數時有最大值,互變異數有最小值(約為零),這代表的意思相當於數據之間的交互相關性降低到很小的值(約為零),也就是透過這樣的轉換使達到數據點間否此不相關的特性. 在這個情況下,拿新數據來做分類或者其他處理,可以有比較好的效果.(減低冗餘)

PS: 原始數據點通常是會事先處理過而得來的特徵點.
--------------------
不過,”不相關”的效果其實還不夠強烈,
正如JK大三當年,cmli上通訊導論課的時候問的好問題:
1. 不相關的數據等不等於具有數據獨立性?
2.獨立的數據是否具有正交性?
3.正交的數據是否保持不相關性?

JK當年在海大中正路上邊騎摩托車邊閃201公車的路上,初步推論出了ROI模型.越沉越香.

2011.0605 by JK

prague12 發表在 痞客邦 留言(0) 人氣()

JK 對PCA做的夢境分析

參考:
http://blog.sina.com.cn/s/blog_794c88520100pwj2.html
http://www.shamoxia.com/html/y2011/2544.html

做夢都在分析PCA的維度空間...
在JK夢裡,不斷在PCA維度空間中轉換,有這麼一些體悟在於
PCA主成分分析最主要的概念在於自動的找出原始資料集裡的主成分軸的方向(1維),
隨後再將原始資料(比如2維)投影到主軸上成為1維資料,相對的也可以反轉換回來.
將二維的數據集變成一維的數據集,有降維度簡化數據的功能.但主要是根據降低相關性的概念在做數據轉換.

主軸投影軸也可以是二維的,兩主軸彼此正交,稱為第一主成份軸和第二主成分軸,
主軸是根據特徵值而來的,原始數據是二維度的,基本上特徵值也會有兩個.(一般只選一個)
此時,原始資料各對兩主軸分別投影,可以得到兩組投影量(二維),這相當於是數據做了座標軸旋轉的轉換,這個轉換結果會導致新的數據集(二維)在計算自變異數時有最大值,互變異數有最小值(約為零),這代表的意思相當於數據之間的交互相關性降低到很小的值(約為零),也就是透過這樣的轉換使達到數據間否此不相關的特性. 在這個情況下,拿新數據來做分類或者其他處理,可以有比較好的效果.(減低冗餘)

--------------------
不過,”不相關”的效果其實還不夠強烈,
正如JK大三當年,cmli上通訊導論課的時候問的好問題:
1. 不相關的數據等不等於具有數據獨立性?
2.獨立的數據是否具有正交性?
3.正交的數據是否保持不相關性?

JK當年在海大中正路上邊騎摩托車邊閃201公車的路上,初步推論出了ROI模型.越沉越香.

2011.0605 by JK

prague12 發表在 痞客邦 留言(0) 人氣()

積分影像計算






'-----------黑白化----------------------------------
Dim pic_BW = jk_binary_FromColor(pic, False)
pic_BW.Save("BW" + ".bmp", Imaging.ImageFormat.Bmp) '轉存bmp格式

'------------/黑白化/-----------------------------------


'------------積分影像-----------------------------------
For j = 0 To y - 1
For i = 0 To x - 1
colorG_int_array(i, j) = pic_BW.GetPixel(i, j).R
Next
Next
' 先抓好像素再給 // 否則 pic_BW.GetPixel(i, j).R是很慢的
Dim pic_ITG = Claculate_IntegralImage_log(colorG_int_array, x, y) '
'Dim pic_ITG = Claculate_IntegralImage_log(pic_BW)' 這樣做 約慢8倍

' pic_ITG.Save("ITG_image" + ".bmp", Imaging.ImageFormat.Bmp) '轉存bmp格式
PictureBox_Integral.Image = pic_ITG
' MsgBox("ITG OK")
'------------/積分影像/-----------------------------------





Public Function Claculate_IntegralImage_log(ByVal pic_BWdata(,) As Int16, ByVal lengthX As Integer, ByVal lengthY As Integer) As Bitmap


Dim x = lengthX
Dim y = lengthY
Dim pic_Integral As Bitmap

Dim section(x - 1, y - 1) As Double
For j = 0 To y - 1
For i = 0 To x - 1




'-----積分影像計算-------------
If i = 0 Or j = 0 Then
If j = 0 And i 0 Then
section(i, j) = section(i - 1, j) + pic_BWdata(i, j)
End If
If i = 0 And j 0 Then
section(i, j) = section(i, j - 1) + pic_BWdata(i, j)
End If
If i = 0 And j = 0 Then
section(i, j) = pic_BWdata(i, j)
End If

Else
section(i, j) = section(i, j - 1) + section(i - 1, j) - section(i - 1, j - 1) + pic_BWdata(i, j)

End If



'-----/-積分影像計算-/---------------

Next
Next



pic_Integral = jk_FilltoBitmap_log(section, x, y)
Return pic_Integral

End Function
End Class

prague12 發表在 痞客邦 留言(5) 人氣()

'-------直方統計--------------------------------------------


'--------從範圍內分出2000組級距------------------
Dim N_degree = 2000
Dim angle_max = dAngle.Max
Dim angle_min = dAngle.Min
' MsgBox(angle_max.ToString)

Dim perdegree = (angle_max - angle_min) / N_degree
Dim interval_num(N_degree) As Integer
Dim interval(N_degree) As Double

For i = 0 To N_degree - 1
interval(i + 1) = interval(i) + ((angle_max - angle_min) / N_degree)
Next
'--------/從範圍內分出2000組級距/------------------

For Each mm In dAngle

For i = 0 To N_degree - 1
If mm > interval(i) And mm interval_num(i) = interval_num(i) + 1
End If
Next
Next

'------------------------------
Dim Histogram_w = New StreamWriter(path1 + "_dAngle_Histogram.csv")
Dim Ma = 0
For mm = 0 To interval_num.Count - 1
If interval_num(mm) = interval_num.Max Then
Ma = mm '眾數peak
End If
Next


'-------直方統計--------------------------------------------

prague12 發表在 痞客邦 留言(0) 人氣()

NORMAL分布

======================================

Public Function Normal(ByVal x As Double) As Double
Dim mean = 0
Dim sd = 1
Dim numberator = Pow((x - mean), 2)
Dim denominator = 2 * sd * sd
Dim power_exp = -1 * numberator / denominator
Dim exp_number = Pow(E, power_exp)
Dim gausian_head = 1 / (Sqrt(2 * PI) * sd)
Dim result = gausian_head * exp_number



Return result

End Function





Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click


' Dim aaa = colinear_condition(10, 1, 2, 3, 55, 55, 66, 3, 3, 3)

' Dim q1 = aaa(0, 0)
'Dim q2 = aaa(0, 1)

For i = 0 To 100



Dim randomX As New Random

Dim p = randomX.Next(0, 100)
Dim q = randomX.Next(0, 100) * -1
Dim randomValue = 0
Dim G = Gaussian(randomValue, 0, 1)
Dim N = Normal(randomValue)

' Dim uu = G - N

Next

End Sub

prague12 發表在 痞客邦 留言(0) 人氣()