?? segmentation.bitmap.cs
字號:
using System;
using System.Drawing;
using System.Drawing.Drawing2D;
using System.Drawing.Imaging;
namespace PhotoSprite.ImageProcessing
{
partial class Segmentation
{
/************************************************************
*
* 面積、周長、區域顯示、消除小區域、輪廓跟蹤、提取、投影
*
************************************************************/
/// <summary>
/// 獲取每個區域的面積信息
/// </summary>
/// <param name="b">二值位圖流</param>
/// <returns></returns>
public int[] ImageArea(Bitmap b)
{
// 將原始二值圖轉化為二維數組
byte[,] srcGray = Image2Array(b);
// 進行區域標記
ushort[,] Sign = ImageSign(srcGray);
// 區域面積
int[] Area = ImageArea(Sign);
return Area;
} // end of ImageArea
/// <summary>
/// 獲取每個區域的周長信息
/// </summary>
/// <param name="b">二值位圖流</param>
/// <returns></returns>
public int[] ImagePerimeter(Bitmap b)
{
// 將原始二值圖轉化為二維數組
byte[,] srcGray = Image2Array(b);
// 進行區域標記
ushort[,] Sign = ImageSign(srcGray);
// 區域周長
int[] Perimeter = ImagePerimeter(Sign);
return Perimeter;
} // end of ImagePerimeter
/// <summary>
/// 按指定的區域號繪制出對應的區域
/// </summary>
/// <param name="b">二值位圖流</param>
/// <param name="Region">區域號</param>
/// <param name="showContour">指定bool值,是顯示輪廓線,否顯示區域塊</param>
/// <returns></returns>
public Bitmap ImageRegion(Bitmap b, ushort[] Region, bool showContour)
{
// 將原始二值圖轉化為二維數組
byte[,] srcGray = Image2Array(b);
// 進行區域標記
ushort[,] Sign = ImageSign(srcGray);
// 按輪廓線進行顯示
if (showContour)
Sign = ContourTrace(Sign);
int len = Region.Length;
int width = b.Width;
int height = b.Height;
BitmapData data = b.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
byte* p = (byte*)data.Scan0;
int offset = data.Stride - width * BPP;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
ushort sign = Sign[x, y];
bool showRegion = false;
for (int i = 0; i < len; i++)
{
if (sign == Region[i])
{
showRegion = true;
break;
}
} // i
// 繪制區域
if (showRegion)
{
p[0] = p[1] = p[2] = 0;
}
else
{
p[0] = p[1] = p[2] = 255;
}
p += BPP;
} // x
p += offset;
} // y
}
b.UnlockBits(data);
return b;
} // end of ImageRegion
/// <summary>
/// 消除小區域
/// </summary>
/// <param name="b">二值位圖流</param>
/// <param name="percent">區域面積占圖像面積的百分比[0, 100]</param>
/// <returns></returns>
public Bitmap ClearSmallArea(Bitmap b, int percent)
{
// 將原始二值圖轉化為二維數組
byte[,] srcGray = Image2Array(b);
// 進行區域標記
ushort[,] Sign = ImageSign(srcGray);
// 區域面積
int[] Area = ImageArea(Sign);
int width = b.Width;
int height = b.Height;
// 面積閾值
int area = width * height * percent / 100;
BitmapData data = b.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
byte* p = (byte*)data.Scan0;
int offset = data.Stride - width * BPP;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
ushort sign = Sign[x, y];
// 將原始背景和小區域全部變為背景
if (sign == 0 || Area[sign] < area)
{
p[0] = p[1] = p[2] = 255;
}
else
{
p[0] = p[1] = p[2] = 0;
}
p += BPP;
} // x
p += offset;
} // y
}
b.UnlockBits(data);
return b;
} // end of ClearSmallArea
/// <summary>
/// 輪廓跟蹤
/// </summary>
/// <param name="b">二值位圖流</param>
/// <returns></returns>
public Bitmap ContourTrace(Bitmap b)
{
// 將原始二值圖轉化為二維數組
byte[,] srcGray = Image2Array(b);
// 進行區域標記
ushort[,] Sign = ImageSign(srcGray);
// 輪廓跟蹤
ushort[,] Boundary = ContourTrace(Sign);
int width = b.Width;
int height = b.Height;
BitmapData data = b.LockBits(new Rectangle(0, 0, width, height),
ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
unsafe
{
byte* p = (byte*)data.Scan0;
int offset = data.Stride - width * BPP;
for (int y = 0; y < height; y++)
{
for (int x = 0; x < width; x++)
{
if (Boundary[x, y] != 0)
{
p[0] = p[1] = p[2] = 0;
}
else
{
p[0] = p[1] = p[2] = 255;
}
p += BPP;
} // x
p += offset;
} // y
}
b.UnlockBits(data);
return b;
} // end of ContourTrace
/// <summary>
/// 輪廓提取
/// </summary>
/// <param name="b">二值位圖流</param>
/// <returns></returns>
public Bitmap ContourPick(Bitmap b)
{
// 將原始二值圖轉化為二維數組
byte[,] srcGray = Image2Array(b);
// 輪廓提取
byte[,] dstGray = ContourPick(srcGray);
// 轉換為灰度圖像
return Array2Image(dstGray);
} // end of ContourPick
/// <summary>
/// 圖像投影
/// </summary>
/// <param name="b">二值位圖流</param>
/// <param name="isHorz">是否水平投影</param>
/// <returns></returns>
public Bitmap Project(Bitmap b, bool isHorz)
{
// 將原始二值圖轉化為二維數組
byte[,] srcGray = Image2Array(b);
// 圖像投影
byte[,] dstGray = Project(srcGray, isHorz);
return Array2Image(dstGray);
} // end of Project
}
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -