java实现图像处理高通滤波,图像处理入门——滤波 - leo_de_macondo的个人页面 - OSCHINA - 中文开源技术交流社区...
模糊
圖像模糊的方法可以將每個(gè)像素的rgb值用周?chē)袼氐募訖?quán)平均值來(lái)代替。比如用周?chē)?個(gè)像素來(lái)計(jì)算加權(quán)平均值,權(quán)值可以用一個(gè)3x3的矩陣來(lái)表示:
| 1?? 2?? 1 |
| 2?? 4?? 2 |?? *? (1/16)
| 1?? 2?? 1 |
中間的像素是要處理的像素,越靠近中間權(quán)值越大;所有權(quán)值的和為1。用平均值代替原像素的rgb值之后,每個(gè)像素于周?chē)袼氐牟町惓潭茸冃×?#xff1b;該矩陣相當(dāng)于一個(gè)二維的低通濾波器。下面是c#的代碼
public Bitmap FilterBitmap(Bitmap bmp)
{
// 創(chuàng)建如下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;
// 循環(huán)處理第2行開(kāi)始到倒數(shù)第2行;第2列開(kāi)始到倒數(shù)第2列的像素,
// 因?yàn)榈谧钔饷嬉蝗Φ南袼刂車(chē)鷽](méi)有8個(gè)像素
for (int y = 1; y < height; y++)
{
for (int x = 1; x < width; x++)
{
// 將周?chē)?個(gè)像素的rgb加權(quán)平均值作為被處理像素的值
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;
}
動(dòng)態(tài)模糊或徑向模糊等處理方法也是用加權(quán)平均值代替原像素的值,只是用于計(jì)算平均值的像素是一條曲線或射線上的像素而不是周?chē)蝗Φ南袼亍?/p>
銳化
相對(duì)于模糊,銳化可以讓圖像看似更加清晰。方法是把每一個(gè)像素與周?chē)袼氐牟町惙糯蟆M瑯涌梢杂靡粋€(gè)3x3矩陣來(lái)表示周?chē)?個(gè)像素的權(quán)值,權(quán)值相加為1;與用于模糊的矩陣不同的是,用于銳化的矩陣中間像素的權(quán)值是正的,而周?chē)臋?quán)值是負(fù)的。以下面的矩陣為例
| 0?? –1??? 0 |
| –1?? 5?? -1 |
| 0?? –1??? 0 |
中間像素的rgb值先增大5倍,再與周?chē)?個(gè)像素的rgb值做差,即:該像素 +(該像素-上面像素)+(該像素-下面像素)+(該像素-左邊像素)+(該像素-右邊像素)。結(jié)果是,如果周?chē)袼叵鄬?duì)該像素較暗,則差值為正,使得該像素更亮;反之如果周?chē)袼叵鄬?duì)較亮,則使得該像素更暗。該矩陣具有動(dòng)態(tài)增加對(duì)比度的效果,相當(dāng)于一個(gè)高通濾波器,
浮雕效果
浮雕效果與銳化的方法相似,稍不同的是矩陣中的權(quán)值相加為0,比如把上面矩陣中間的5改成4,用該像素與周?chē)袼氐牟钪荡嬖撓袼?#xff1a;
| 0??? –1??? 0 |
| –1??? 4?? -1 |
| 0??? –1??? 0 |
不過(guò)一般的浮雕效果是有光照方向感的,比如東南方向(只與東南方向的像素對(duì)比):
| 0???? 0??? 0 |
| 0??? 2?? -1 |
| 0?? –1??? 0 |
效果是,如果該像素與周?chē)嗤?#xff0c;則該像素rgb的值變成0;如果該像素比周?chē)袼亓?#xff0c;則差值為正;否則差值為負(fù)。但因?yàn)閞gb的值只能是0~255,所以要把處理后的rgb值加上一個(gè)正的偏移量。
public Bitmap FilterBitmap(Bitmap bmp)
{
// 創(chuàng)建如下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;
}
銳化與浮雕處理可以應(yīng)用于圖像的邊緣檢測(cè)
以上主要參考《圖像編程精髓——從開(kāi)發(fā)自己的Photoshop開(kāi)始》
總結(jié)
以上是生活随笔為你收集整理的java实现图像处理高通滤波,图像处理入门——滤波 - leo_de_macondo的个人页面 - OSCHINA - 中文开源技术交流社区...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: java继承与多态性_Java继承与多态
- 下一篇: java 数据结构 迷宫_JAVA数据结