그냥 test용으로 작성한 코드라 대강대강 만들었다.
대략 알고리즘은 주변 값들과 비교해서 피부영역이 많으면 피부영역으로 잡고 제거된 부분이 많으면 같이 제거하는 방식이다.
#region 노이즈 제거
private void DeleteNoise()
{
for (int i = 0; i < skin_YCC.Height; i++)
{
for (int j = 0; j < skin_YCC.Width; j++)
{
//경계영역은 무시
if (i < 5 || i > skin_YCC.Height - 6 || j < 5 || j > skin_YCC.Width - 6) continue;
if (CountNoise(i, j) > 55) labeling_제거1[i, j] = 1;
if (Count보간(i, j) > 80 && labeling_제거1[i, j] > -200) labeling_제거1[i, j] = -1;
}
}
}
private int Count보간(int row, int col)
{
int result = 0;
for (int i = row - 5; i < row + 5; i++)
{
for (int j = col - 5; j < col + 5; j++)
{
if (labeling_제거1[i, j] <= 0) //0이면 제거되지 않은 픽셀_2로 제거된 픽셀도 제외
{
result++;
}
}
}
return result;
}
private int CountNoise(int row, int col)
{
int result = 0;
for (int i = row - 5; i < row + 5; i++)
{
for (int j = col - 5; j < col + 5; j++)
{
if (labeling_제거1[i, j] >= 1) //1이면 초기에 제거된 픽셀만
{
result++;
}
}
}
return result;
}
#endregion