图像分析(自动记数) |
尚未結案
|
chenliyan163
一般會員 發表:30 回覆:30 積分:12 註冊:2003-09-15 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 如何用delphi将下面那幅图像用电脑自动来扫描出那里面有多少个酵母菌 http://www.my2000.biz/temp1/1.jpg 扫出的结果像这样: http://www.my2000.biz/temp1/3.jpg 注:本人为了节省空间特用JPG放在网上,在处理的时候用的是BMP格式的去查查影像辨識的書吧!! 這麼大的題目, 不是三言兩語就可以解決的!! 光是要程式可以 "認" 酵母菌的外觀就是一個大麻煩, 何況你的圖還可能有一堆的酵母菌擠在一起. ...Aquarius
------
水瓶男的blog: http://791909.blogspot.com |
chenliyan163
一般會員 發表:30 回覆:30 積分:12 註冊:2003-09-15 發送簡訊給我 |
那个我用二值化,可以将图像中的细菌扫出来,
就是不知道怎样才可以让计算机知道,是否可以算是一个细菌
下面是一个二值化的源代码:
const
red: cardinal = $FF;
blue: cardinal = $FF0000;
var
rgb: integer;
i, j, l: Integer;
begin
l:=((255 255 255) *TrackBar1.Position) div 100;
for i := 0 to image1.picture.bitmap.height-1 do
begin
rgb := integer(image1.picture.bitmap.scanline[i]);
for j := 0 to image1.picture.bitmap.width-1 do
begin
if pbyte(rgb)^ pbyte(rgb 1)^ pbyte(rgb 2)^>l then
// move(blue, pbyte(rgb)^, 3)
else move(red, pbyte(rgb)^, 3);
inc(rgb, 3);
end;
end;
form1.Refresh;
end;
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
|
chenliyan163
一般會員 發表:30 回覆:30 積分:12 註冊:2003-09-15 發送簡訊給我 |
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
|
chenliyan163
一般會員 發表:30 回覆:30 積分:12 註冊:2003-09-15 發送簡訊給我 |
好的,非常感谢,所有楼上的仁兄,小弟这个有个想法,想你们指导指导,是这样的:
我先将图像进行二值化(http://www.my2000.biz/temp1/1.jpg)把图像分成黑和白两种,然后对图像的第10行开始进行扫描,当发现有一个黑点时,对X轴的另一点进行扫描(也就是细菌的直径),假如当那个点也是黑色的,那么再取细菌的中心点,在Y轴(细菌中心点下面)进行下面扫描,扫完再对中心点以上进行扫描,当发现都扫到黑点时,就判断此是细菌,发现第一个细菌后跳过细菌直径的点,再进行扫描,直到全部扫完为止,下面是我的代码:()请各位仁兄帮我看看,里面还存在着什么问题,谢谢各位.
procedure TForm1.y1Click(Sender: TObject);
var
line_x,line_y:integer;
scarcity_x,overstep_x:integer;
scarcity_up_y,overstep_up_y:integer;
scarcity_down_y,overstep_down_y:integer;
origin:integer;//原点 begin
count_bacilli:=1; //初始化
line_y:=10;
while line_y<=image1.picture.bitmap.height-1 do
begin
line_x:=10;
while line_x<=image1.picture.bitmap.Width-10 do
begin
if form1.Image1.Canvas.Pixels[line_x,line_y]=0 then //当为0时,此时点为黑色(找到第一个黑点)
begin
form1.Image1.Canvas.Pixels[line_x,line_y]:=255;
scarcity_x:=trunc(line_x TrackBar2.Position*0.7);
overstep_x:=trunc(line_x TrackBar2.Position*1.3);
while scarcity_x<=overstep_x do
begin
if form1.Image1.Canvas.Pixels[scarcity_x,line_y]=0 then //找到第二个黑点
begin
origin:=line_x trunc((scarcity_x-line_x) div 2); //计算出细菌的中心点
scarcity_down_y:=line_y 10;
overstep_down_y:=line_y 20;
while scarcity_down_y<=overstep_down_y do //对Y轴进行搜寻(下)
begin
if form1.Image1.Canvas.Pixels[origin,scarcity_down_y]=0 then
begin
form1.Image1.Canvas.Pixels[origin,scarcity_down_y]:=255;
scarcity_up_y:=line_y-10;
overstep_up_y:=line_y-20;
while overstep_up_y<=scarcity_up_y do //对Y轴进行搜寻(上)
begin
if form1.Image1.Canvas.Pixels[origin,scarcity_up_y]=0 then
begin
form1.Image1.Canvas.Pixels[origin,overstep_up_y]:=255;
form1.Image1.Canvas.TextOut(line_x 5,line_y-5,inttostr(count_bacilli));
//line_x:=line_x 1; //找到点后进行跳过这个点
count_bacilli:=count_bacilli 1;
end;
overstep_up_y:=overstep_up_y 1;
end;
end;
scarcity_down_y:=scarcity_down_y 1;
end;
end
else
begin
break;
end;
scarcity_x:=scarcity_x 1;
end; end;
line_x:=line_x 1;
end;
line_y:=line_y 29;
end;
form1.Label2.Caption:=inttostr(count_bacilli);
end;
|
syntax
尊榮會員 發表:26 回覆:1139 積分:1258 註冊:2002-04-23 發送簡訊給我 |
基本上,對你的做法沒有多大的意見,因為只要做得出來你的結果就可以
但是要注意 1.其實你做的是圓形或近似圓形的判斷,在影像判斷的書中,剛開始的就是判斷幾何圖形,圓形,方形...等,直接翻書轉成程式碼會有較佳的執行效果,因為你的判斷上仍是有著瑕疵,就是說雖然演算法理論是正確的但你在判斷處理時,出現誤判的機會能高於50%,這是依你的程式演算法的推斷,因為可能判斷出來的不是圓形,只是不相干的數條小小線段或雜點,這是可以想像的,所以在判斷上應該用多點與不定位置取樣或是區域線段判斷來增加客觀率,以確保找到的點是圓形的一部分(當然圖中的細菌不一定是正圓形,也要考慮重疊之類的狀況) 2.再來,就是在二值化的演算方式,雖然是很簡單的,但是二值化的效果卻是影響很大的,所以與其在二值化後在做影像最佳化之類的處理,不如一次就在二值化時完成,越是清處無雜點,無雜線的圖形,在辨認的演算程式上就越簡單 因為目前影像辨認的領域沒有一個共同的標準程式可以通用於各種狀況,所以你還是要依你的需求一步一步自己來設計
|
chenliyan163
一般會員 發表:30 回覆:30 積分:12 註冊:2003-09-15 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |