Discussion:
[問題] 關於灰階影像處理..
(时间太久无法回复)
灰色地帶
2006-12-05 20:49:25 UTC
Permalink
小弟最近要寫一個影像處理的程式,目前的進度卡在要將圖片轉為灰階陣列顯示出來

目前我已經能夠抓到圖片的Pixel值了,想請問是否有能夠用灰階的方式將抓到的值

表達並顯示出來?

可以順便問一下,我目前抓到的值是以一維的方式顯示出來的,但我還不懂如何將一維

轉為二維,是否可以指點一下迷津?

public static void main(String[] args) throws Exception {
JFrame window = new JFrame("圖片");
window.setSize(700,700);
window.setLocation(50,50);
Container c = window.getContentPane();
new DemoImages();
Image image = DemoImages.getImage("4.jpg",window);
ImagePanel ip = new ImagePanel();
ip.setImage(image);
c.add(ip);
window.setVisible(true);

PixelGrabber pixel = new PixelGrabber(image,0,0,image.getWidth(null),image.getHeight(null),false);
pixel.startGrabbing();

while(!pixel.grabPixels()) {

}


以上是程式碼...請哪個好心人告訴我一下吧,目前Error一大堆,接近崩潰邊緣>"<..

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.211.243
audi24
2006-12-05 21:12:36 UTC
Permalink
※ 引述《devlish (灰色地帶)》之銘言:
: 小弟最近要寫一個影像處理的程式,目前的進度卡在要將圖片轉為灰階陣列顯示出來
: 目前我已經能夠抓到圖片的Pixel值了,想請問是否有能夠用灰階的方式將抓到的值
: 表達並顯示出來?
: 可以順便問一下,我目前抓到的值是以一維的方式顯示出來的,但我還不懂如何將一維
: 轉為二維,是否可以指點一下迷津?
: public static void main(String[] args) throws Exception {
: JFrame window = new JFrame("圖片");
: window.setSize(700,700);
: window.setLocation(50,50);
: Container c = window.getContentPane();
: new DemoImages();
: Image image = DemoImages.getImage("4.jpg",window);
: ImagePanel ip = new ImagePanel();
: ip.setImage(image);
: c.add(ip);
: window.setVisible(true);
: PixelGrabber pixel = new PixelGrabber(image,0,0,image.getWidth(null),image.getHeight(null),false);
: pixel.startGrabbing();
: while(!pixel.grabPixels()) {
: }
: 以上是程式碼...請哪個好心人告訴我一下吧,目前Error一大堆,接近崩潰邊緣>"<..

我都是用一維去做,因為存檔也要用一維去存

imagePixel[]//known

int R[][]=new int[imageHeight][imageWidth];//R pixel

for(int y=0;y<imageHeight;y++){
for(int x=0;x<imageWidth;x++){
R[y][x]=imagePixel[y*imageWidth+x];
}
}

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.136.147.111
小安
2006-12-05 21:25:20 UTC
Permalink
※ 引述《devlish (灰色地帶)》之銘言:
: 小弟最近要寫一個影像處理的程式,目前的進度卡在要將圖片轉為灰階陣列顯示出來
: 目前我已經能夠抓到圖片的Pixel值了,想請問是否有能夠用灰階的方式將抓到的值
: 表達並顯示出來?

偷偷轉一篇去年在 C_and_CPP 板上看到的文章,
希望原作者不會介意 :)

---
※ 引述《jetset (方塊中的生活...)》之銘言:
: 先把RGB轉到YUV
: 其中的Y是指luminance
: 就是你要的gray level
: 轉換的方式為
: Y = 0.299R + 0.587G + 0.114B
: U =-0.169R - 0.331G + 0.500B
: V = 0.500R - 0.419G - 0.081B
---

綠色的比重比較高,是因為人類對於綠色的感覺比較敏銳的關係

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.126.173.31
P***@mobbs.stut.edu.tw
2006-12-06 06:37:08 UTC
Permalink
提供一個方法 很久以前寫的
變數的命名實在是...自已都要看不懂嚕
總之把這當黑盒子用就好..
不要管裡面寫什麼了XD

BufferedImage -> double[][]
-----------------------------------------------------
double[][] transfer(BufferedImage img){
int w=img.getWidth();
int h=img.getHeight();
int X3_1=0;
int X3_2=0;
double[][] temp = new double[h][w*3];
double[] a=img.getRaster().getPixels(0, 0, w, h, a);
for(int j=0;j<h;j++){
for(int i=0;i<w;i++){
X3_1=(j*w+i)*3;
X3_2=i*3;
temp[j][X3_2]=a[X3_1];
temp[j][X3_2+1]=a[X3_1+1];
temp[j][X3_2+2]=a[X3_1+2];


}
}
return temp;
}
m*[1;37;40m-----------------------------------------------------*[m*[mm
m*[1;37;40m-----------------------------------------------------*[m*[mm
轉灰階
void doGray(double[][] da,int x ,int y,int w,int h){
int X3=0;
int gray=0;
for(int j=y;j<h;j++){
for(int i=x;i<w;i++){
X3=i*3;
gray=(int)(0.299*da[j][X3]+0.587*da[j][X3+1]+0.114*da[j][X3+2]);


da[j][X3]=da[j][X3+1]=da[j][X3+2]=gray;


}
}

}
m*[1;37;40m-----------------------------------------------------*[m*[mm
Post by 灰色地帶
小弟最近要寫一個影像處理的程式,目前的進度卡在要將圖片轉為灰階陣列顯示出來
目前我已經能夠抓到圖片的Pixel值了,想請問是否有能夠用灰階的方式將抓到的值
表達並顯示出來?
可以順便問一下,我目前抓到的值是以一維的方式顯示出來的,但我還不懂如何將一維
轉為二維,是否可以指點一下迷津?
public static void main(String[] args) throws Exception {
JFrame window = new JFrame("圖片");
window.setSize(700,700);
window.setLocation(50,50);
Container c = window.getContentPane();
new DemoImages();
Image image = DemoImages.getImage("4.jpg",window);
ImagePanel ip = new ImagePanel();
ip.setImage(image);
c.add(ip);
window.setVisible(true);
PixelGrabber pixel = new PixelGrabber(image,0,0,image.getWidth(null),image.getHeight(null),false);
pixel.startGrabbing();
while(!pixel.grabPixels()) {
}
以上是程式碼...請哪個好心人告訴我一下吧,目前Error一大堆,接近崩潰邊緣>"<..
--


赤糸
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-160-28.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
Believing is seeing! ^^
2006-12-06 01:19:58 UTC
Permalink
※ 引述《devlish (灰色地帶)》之銘言:
: 小弟最近要寫一個影像處理的程式,目前的進度卡在要將圖片轉為灰階陣列顯示出來
: 目前我已經能夠抓到圖片的Pixel值了,想請問是否有能夠用灰階的方式將抓到的值
: 表達並顯示出來?
: 可以順便問一下,我目前抓到的值是以一維的方式顯示出來的,但我還不懂如何將一維
: 轉為二維,是否可以指點一下迷津?
[以下恕刪]

  如果你不計較轉灰階的效果好壞的話,
  可以直接利用 Java API 來幫你做:

ColorConvertOp grayOp = new ColorConvertOp(
ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
grayOp.filter(srcImage, destImage);

  詳細說明請參考 API 文件。

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 218.175.150.87
灰色地帶
2006-12-12 13:24:01 UTC
Permalink
※ 引述《***@mobbs.stut.edu.tw ()》之銘言:
: 提供一個方法 很久以前寫的
: 變數的命名實在是...自已都要看不懂嚕
: 總之把這當黑盒子用就好..
: 不要管裡面寫什麼了XD
: BufferedImage -> double[][]
: -----------------------------------------------------
: double[][] transfer(BufferedImage img){
: int w=img.getWidth();
: int h=img.getHeight();
: int X3_1=0;
: int X3_2=0;
: double[][] temp = new double[h][w*3];
: double[] a=img.getRaster().getPixels(0, 0, w, h, a);
: for(int j=0;j<h;j++){
: for(int i=0;i<w;i++){
: X3_1=(j*w+i)*3;
: X3_2=i*3;
: temp[j][X3_2]=a[X3_1];
: temp[j][X3_2+1]=a[X3_1+1];
: temp[j][X3_2+2]=a[X3_1+2];
: }
: }
: return temp;
: }
: m*[1;37;40m-----------------------------------------------------*[m*[mm
: m*[1;37;40m-----------------------------------------------------*[m*[mm
: 轉灰階
: void doGray(double[][] da,int x ,int y,int w,int h){
: int X3=0;
: int gray=0;
: for(int j=y;j<h;j++){
: for(int i=x;i<w;i++){
: X3=i*3;
: gray=(int)(0.299*da[j][X3]+0.587*da[j][X3+1]+0.114*da[j][X3+2]);
: da[j][X3]=da[j][X3+1]=da[j][X3+2]=gray;
: }
: }
: }
: m*[1;37;40m-----------------------------------------------------*[m*[mm
: ※ ***@ptt.cc (灰色地帶) wrote:
: > 小弟最近要寫一個影像處理的程式,目前的進度卡在要將圖片轉為灰階陣列顯示出來
: > 目前我已經能夠抓到圖片的Pixel值了,想請問是否有能夠用灰階的方式將抓到的值
: > 表達並顯示出來?
: > 可以順便問一下,我目前抓到的值是以一維的方式顯示出來的,但我還不懂如何將一維
: > 轉為二維,是否可以指點一下迷津?
: > public static void main(String[] args) throws Exception {
: > JFrame window = new JFrame("圖片");
: > window.setSize(700,700);
: > window.setLocation(50,50);
: > Container c = window.getContentPane();
: > new DemoImages();
: > Image image = DemoImages.getImage("4.jpg",window);
: > ImagePanel ip = new ImagePanel();
: > ip.setImage(image);
: > c.add(ip);
: > window.setVisible(true);
: > PixelGrabber pixel = new PixelGrabber(image,0,0,image.getWidth(null),image.getHeight(null),false);
: > pixel.startGrabbing();
: > while(!pixel.grabPixels()) {
: > }
: > 以上是程式碼...請哪個好心人告訴我一下吧,目前Error一大堆,接近崩潰邊緣>"<..


請問,如果以用BufferImage來做處理為概念,要將小弟所寫的上面的程式碼繼續往下寫

先將Load的圖片轉為灰階,然後再將其中的影像轉為二維的灰階陣列,並且將結果與原先

的圖片一同顯示於兩個不同的window,也就是說,除了原先顯示的圖片之外,還要多顯示

一個處理過的灰階影像圖片(已抓到Pixel值的)

小弟在書上看到一個Utilities的方法,但試下來的結果就只有

image=Utilities.makeBufferedImage(image);

這一條成功而已,而且原先會顯示的Pixel值也不再顯示了.......= "=

上面的敘述有點亂,可能因為我的腦袋也是一團亂....

想請教,以這樣的敘述下來,有什麼好的方法可以呈現出來....

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.211.243
淺水中
2006-12-12 21:01:57 UTC
Permalink
※ 引述《devlish (灰色地帶)》之銘言:
: ※ 引述《***@mobbs.stut.edu.tw ()》之銘言:
: : 提供一個方法 很久以前寫的
: : 變數的命名實在是...自已都要看不懂嚕
: : 總之把這當黑盒子用就好..
: : 不要管裡面寫什麼了XD
: : BufferedImage -> double[][]
: : -----------------------------------------------------
: : double[][] transfer(BufferedImage img){
: : int w=img.getWidth();
: : int h=img.getHeight();
: : int X3_1=0;
: : int X3_2=0;
: : double[][] temp = new double[h][w*3];
: : double[] a=img.getRaster().getPixels(0, 0, w, h, a);
: : for(int j=0;j<h;j++){
: : for(int i=0;i<w;i++){
: : X3_1=(j*w+i)*3;
: : X3_2=i*3;
: : temp[j][X3_2]=a[X3_1];
: : temp[j][X3_2+1]=a[X3_1+1];
: : temp[j][X3_2+2]=a[X3_1+2];
: : }
: : }
: : return temp;
: : }
: : m*[1;37;40m-----------------------------------------------------*[m*[mm
: : m*[1;37;40m-----------------------------------------------------*[m*[mm
: : 轉灰階
: : void doGray(double[][] da,int x ,int y,int w,int h){
: : int X3=0;
: : int gray=0;
: : for(int j=y;j<h;j++){
: : for(int i=x;i<w;i++){
: : X3=i*3;
: : gray=(int)(0.299*da[j][X3]+0.587*da[j][X3+1]+0.114*da[j][X3+2]);
: : da[j][X3]=da[j][X3+1]=da[j][X3+2]=gray;
: : }
: : }
: : }
: : m*[1;37;40m-----------------------------------------------------*[m*[mm
: 請問,如果以用BufferImage來做處理為概念,要將小弟所寫的上面的程式碼繼續往下寫
: 先將Load的圖片轉為灰階,然後再將其中的影像轉為二維的灰階陣列,並且將結果與原先
: 的圖片一同顯示於兩個不同的window,也就是說,除了原先顯示的圖片之外,還要多顯示
: 一個處理過的灰階影像圖片(已抓到Pixel值的)
: 小弟在書上看到一個Utilities的方法,但試下來的結果就只有
: image=Utilities.makeBufferedImage(image);
: 這一條成功而已,而且原先會顯示的Pixel值也不再顯示了.......= "=
: 上面的敘述有點亂,可能因為我的腦袋也是一團亂....
: 想請教,以這樣的敘述下來,有什麼好的方法可以呈現出來....
基本上我有幾點覺得很困惑
1.為什麼一定要轉成二維的來做灰階?
你的演算法真的是做灰階嗎?我看起來覺得不像
我的感覺是在做矩陣運算
是在做RGB轉成Y,Cb,Cr的運算吧!
gray應該是RGB三個值要相等
你的怎麼算也不會相等

2.你要畫兩張圖
為什麼不一開始先把原圖就直接畫出來
做完圖型運算後再把結果畫出來
這樣就會很完美的顯示兩張圖了阿

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.105.36
P***@mobbs.stut.edu.tw
2006-12-13 05:43:16 UTC
Permalink
Post by audi24
※ 引述《devlish (灰色地帶)》之銘言:
: 請問,如果以用BufferImage來做處理為概念,要將小弟所寫的上面的程式碼繼續往下寫
: 先將Load的圖片轉為灰階,然後再將其中的影像轉為二維的灰階陣列,並且將結果與原先
: 的圖片一同顯示於兩個不同的window,也就是說,除了原先顯示的圖片之外,還要多顯示
: 一個處理過的灰階影像圖片(已抓到Pixel值的)
: 小弟在書上看到一個Utilities的方法,但試下來的結果就只有
: image=Utilities.makeBufferedImage(image);
: 這一條成功而已,而且原先會顯示的Pixel值也不再顯示了.......= "=
: 上面的敘述有點亂,可能因為我的腦袋也是一團亂....
: 想請教,以這樣的敘述下來,有什麼好的方法可以呈現出來....
基本上我有幾點覺得很困惑
1.為什麼一定要轉成二維的來做灰階?
你的演算法真的是做灰階嗎?我看起來覺得不像
我的感覺是在做矩陣運算
是在做RGB轉成Y,Cb,Cr的運算吧!
gray應該是RGB三個值要相等
你的怎麼算也不會相等
2.你要畫兩張圖
為什麼不一開始先把原圖就直接畫出來
做完圖型運算後再把結果畫出來
這樣就會很完美的顯示兩張圖了阿
轉灰階公式Gray = 0.299 * R + 0.587 * G + 0.114 * B
以下就是在做轉灰階不是嗎?
for(int j=y;j<h;j++){
for(int i=x;i<w;i++){
X3=i*3;
gray=(int)(0.299*da[j][X3]+0.587*da[j][X3+1]+0.114*da[j][X3+2]);

da[j][X3]=da[j][X3+1]=da[j][X3+2]=gray;
}
}

是先轉成二維 再做灰階
我之前在做影像處理 需要詳細的Pixel值 才會想要先轉成二維
不然轉灰階 我記得有現成的方法可以用吧= =?

至於第二個問題 我記得java對於物件是傳參照吧
如果直接對傳進來的圖片修改 那原圖也會被更改到
--


赤糸
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-160-26.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
淺水中
2006-12-13 01:20:28 UTC
Permalink
※ 引述《***@mobbs.stut.edu.tw ()》之銘言:
: ※ ***@ptt.cc (淺水中) wrote:
: > 基本上我有幾點覺得很困惑
: > 1.為什麼一定要轉成二維的來做灰階?
: > 你的演算法真的是做灰階嗎?我看起來覺得不像
: > 我的感覺是在做矩陣運算
: > 是在做RGB轉成Y,Cb,Cr的運算吧!
: > gray應該是RGB三個值要相等
: > 你的怎麼算也不會相等
: > 2.你要畫兩張圖
: > 為什麼不一開始先把原圖就直接畫出來
: > 做完圖型運算後再把結果畫出來
: > 這樣就會很完美的顯示兩張圖了阿
: 轉灰階公式Gray = 0.299 * R + 0.587 * G + 0.114 * B
: 以下就是在做轉灰階不是嗎?
: for(int j=y;j<h;j++){
: for(int i=x;i<w;i++){
: X3=i*3;
: gray=(int)(0.299*da[j][X3]+0.587*da[j][X3+1]+0.114*da[j][X3+2]);
: da[j][X3]=da[j][X3+1]=da[j][X3+2]=gray;
: }
: }
: 是先轉成二維 再做灰階
: 我之前在做影像處理 需要詳細的Pixel值 才會想要先轉成二維
: 不然轉灰階 我記得有現成的方法可以用吧= =?
好吧,後來想想Y(亮度)當灰階來看也沒啥不對
但也沒必要用二維
int r,g,b,Y;
for (int i =0 ; i<pixels.length;i++){
r = (pixels[i]>>16) & 0xff;
g = (pixels[i]>>8) & 0xff;
b = (pixels[i]) & 0xff;

Y = (int) 0.299 * r + 0.587 * g + 0.114 * b;
gray[i] = (Y << 16)| (Y << 8)| Y | 0xff000000;
}

然後利用BufferedImage.setRGB(0,0,w,h,gray,0,w);
這樣就可以很輕易的得到新的BufferedImage

: 至於第二個問題 我記得java對於物件是傳參照吧
: 如果直接對傳進來的圖片修改 那原圖也會被更改到
你圖都畫出去了,沒有理由畫出去的圖會被改變
除非你很care原使資料
就算如此
開一個一樣大的BufferedImage然後利用setRGB把算出來的Gray設上去也不困難吧

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.123.105.36
※ 編輯: calais007 來自: 140.123.105.36 (12/13 17:20)
灰色地帶
2006-12-13 01:59:16 UTC
Permalink
抱歉,我想我的想法是錯誤的,我想做的最後的結果,就是呈現出一張原始的圖片,

以及一張處理過的灰階影像圖,而由於第二張圖片我必須要將裡面的圓圈輪廓給框

出來(我的background是黑色的);而第二張圖片就只要呈現出輪廓就好了

會有要轉成二階的想法,是怕到時候以一階的的方式無法將處理過的圖片給呈現出來

所以才會有這樣的想法

轉成灰階,抓取輪廓的Pixel值,挑出黑色輪廓的部份,進而呈現出來這是我的最終目的



原圖--->灰階處理---->抓取Pixel值--->挑出最接近圖片的黑色輪廓--->呈現出只有輪廓

的圖片---->兩兩能夠做比較,這樣才知道抓的到底對或是不對.....

--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 220.130.211.243
P***@mobbs.stut.edu.tw
2006-12-13 10:01:54 UTC
Permalink
Post by 淺水中
: 轉灰階公式Gray = 0.299 * R + 0.587 * G + 0.114 * B
: 以下就是在做轉灰階不是嗎?
: for(int j=y;j<h;j++){
: for(int i=x;i<w;i++){
: X3=i*3;
: gray=(int)(0.299*da[j][X3]+0.587*da[j][X3+1]+0.114*da[j][X3+2]);
: da[j][X3]=da[j][X3+1]=da[j][X3+2]=gray;
: }
: }
: 是先轉成二維 再做灰階
: 我之前在做影像處理 需要詳細的Pixel值 才會想要先轉成二維
: 不然轉灰階 我記得有現成的方法可以用吧= =?
好吧,後來想想Y(亮度)當灰階來看也沒啥不對
但也沒必要用二維
int r,g,b,Y;
for (int i =0 ; i<pixels.length;i++){
r = (pixels[i]>>16) & 0xff;
g = (pixels[i]>>8) & 0xff;
b = (pixels[i]) & 0xff;
Y = (int) 0.299 * r + 0.587 * g + 0.114 * b;
gray[i] = (Y << 16)| (Y << 8)| Y | 0xff000000;
}
然後利用BufferedImage.setRGB(0,0,w,h,gray,0,w);
這樣就可以很輕易的得到新的BufferedImage
: 至於第二個問題 我記得java對於物件是傳參照吧
: 如果直接對傳進來的圖片修改 那原圖也會被更改到
你圖都畫出去了,沒有理由畫出去的圖會被改變
除非你很care原使資料
就算如此
開一個一樣大的BufferedImage然後利用setRGB把算出來的Gray設上去也不困難吧
^^^
我實作是是這樣做沒錯啊= =a

之前是想用來做人臉辨識..
可是做一做發現速度比用BCB慢很多
就放棄了Orz

寫成二維陣列是因為還要做其它複雜的處理
可能是只截取一部分程式碼下來 所以看起來怪怪的...
--


赤糸
--
 ◣ ███ ███ ☆  Post by Pistachi 
 ◢█ ▉▉█ █▇█ ★ From 220-134-160-26.HINET-IP.hinet.net 
◥█◤ ﹉ ﹍ ﹋ 月光海洋BBS 《mobbs.stut.edu.tw》 163.26.220.130 
继续阅读narkive:
Loading...