java实现图像处理高通滤波,图像处理入门——滤波 - leo_de_macondo的个人页面 - OSCHINA - 中文开源技术交流社区...
模糊
圖像模糊的方法可以將每個像素的rgb值用周圍像素的加權平均值來代替。比如用周圍的9個像素來計算加權平均值,權值可以用一個3x3的矩陣來表示:
| 1?? 2?? 1 |
| 2?? 4?? 2 |?? *? (1/16)
| 1?? 2?? 1 |
中間的像素是要處理的像素,越靠近中間權值越大;所有權值的和為1。用平均值代替原像素的rgb值之后,每個像素于周圍像素的差異程度變小了;該矩陣相當于一個二維的低通濾波器。下面是c#的代碼
public Bitmap FilterBitmap(Bitmap bmp)
{
// 創建如下3x3矩陣:
// | 1 2 1 |
// (1/16) * | 2 4 2 |
// | 1 2 1 |
double[,] core = new double[,] { { 1, 2, 1 }, { 2, 4, 2 }, { 1, 2, 1 } };
int scale = 16;
for (int i = 0; i < 3; i++)
for (int j = 0; j < 3; j++)
core[i, j] /= scale;
Bitmap retBmp = new Bitmap(bmp.Width, bmp.Height);
double r, g, b;
int width = bmp.Width - 1;
int height = bmp.Height - 1;
// 循環處理第2行開始到倒數第2行;第2列開始到倒數第2列的像素,
// 因為第最外面一圈的像素周圍沒有8個像素
for (int y = 1; y < height; y++)
{
for (int x = 1; x < width; x++)
{
// 將周圍8個像素的rgb加權平均值作為被處理像素的值
r = g = b = 0;
for (int j = -1; j <= 1; j++)
{
for (int i = -1; i <= 1; i++)
{
Color pix = bmp.GetPixel(x + i, y + j);
r += core[i + 1, j + 1] * pix.R;
g += core[i + 1, j + 1] * pix.G;
b += core[i + 1, j + 1] * pix.B;
}
}
// 確保rgb的值在0到255
if (r < 0) r = 0; if (r > 255) r = 255;
if (b < 0) b = 0; if (b > 255) b = 255;
if (g < 0) g = 0; if (g > 255) g = 255;
retBmp.SetPixel(x, y, Color.FromArgb((int)r, (int)g, (int)b));
}
}
return retBmp;
}
動態模糊或徑向模糊等處理方法也是用加權平均值代替原像素的值,只是用于計算平均值的像素是一條曲線或射線上的像素而不是周圍一圈的像素。
銳化
相對于模糊,銳化可以讓圖像看似更加清晰。方法是把每一個像素與周圍像素的差異放大。同樣可以用一個3x3矩陣來表示周圍9個像素的權值,權值相加為1;與用于模糊的矩陣不同的是,用于銳化的矩陣中間像素的權值是正的,而周圍的權值是負的。以下面的矩陣為例
| 0?? –1??? 0 |
| –1?? 5?? -1 |
| 0?? –1??? 0 |
中間像素的rgb值先增大5倍,再與周圍4個像素的rgb值做差,即:該像素 +(該像素-上面像素)+(該像素-下面像素)+(該像素-左邊像素)+(該像素-右邊像素)。結果是,如果周圍像素相對該像素較暗,則差值為正,使得該像素更亮;反之如果周圍像素相對較亮,則使得該像素更暗。該矩陣具有動態增加對比度的效果,相當于一個高通濾波器,
浮雕效果
浮雕效果與銳化的方法相似,稍不同的是矩陣中的權值相加為0,比如把上面矩陣中間的5改成4,用該像素與周圍像素的差值代替該像素:
| 0??? –1??? 0 |
| –1??? 4?? -1 |
| 0??? –1??? 0 |
不過一般的浮雕效果是有光照方向感的,比如東南方向(只與東南方向的像素對比):
| 0???? 0??? 0 |
| 0??? 2?? -1 |
| 0?? –1??? 0 |
效果是,如果該像素與周圍相同,則該像素rgb的值變成0;如果該像素比周圍像素亮,則差值為正;否則差值為負。但因為rgb的值只能是0~255,所以要把處理后的rgb值加上一個正的偏移量。
public Bitmap FilterBitmap(Bitmap bmp)
{
// 創建如下3x3矩陣:
// | 0 0 0 |
// | 0 2 -1 |
// | 0 -1 0 |
int[,] core = new int[,] { { 0, 0, 0 }, { 0, 2, -1 }, { 0, -1, 0 } };
// 偏移量
int offset = 100;
Bitmap retBmp = new Bitmap(bmp.Width, bmp.Height);
int width = bmp.Width - 1;
int height = bmp.Height - 1;
int r, g, b;
for (int y = 1; y < height; y++)
{
for (int x = 1; x < width; x++)
{
r = g = b = 0;
for (int j = -1; j <= 1; j++)
{
for (int i = -1; i <= 1; i++)
{
Color pix = bmp.GetPixel(x + i, y + j);
r += core[i + 1, j + 1] * pix.R;
g += core[i + 1, j + 1] * pix.G;
b += core[i + 1, j + 1] * pix.B;
}
}
// 加上偏移量
r += offset;
g += offset;
b += offset;
if (r < 0) r = 0; if (r > 255) r = 255;
if (g < 0) g = 0; if (g > 255) g = 255;
if (b < 0) b = 0; if (b > 255) b = 255;
retBmp.SetPixel(x, y, Color.FromArgb(r, g, b));
}
}
return retBmp;
}
銳化與浮雕處理可以應用于圖像的邊緣檢測
以上主要參考《圖像編程精髓——從開發自己的Photoshop開始》
總結
以上是生活随笔為你收集整理的java实现图像处理高通滤波,图像处理入门——滤波 - leo_de_macondo的个人页面 - OSCHINA - 中文开源技术交流社区...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java继承与多态性_Java继承与多态
- 下一篇: java 数据结构 迷宫_JAVA数据结