2014-07-16 3 views
0

그래서이 질문을 검색하여 많은 조회수를 얻었으므로 아래에 표시된 코드를 찾을 수있었습니다. ImageStack (ImageJ)에서 이미지를 가져오고 있으며 두 개의 이미지를 겹쳐서 dicom 형식 (.dcm)으로 만듭니다. 내 문제는 두 이미지가 서로 겹치기 때문에 투명하게 보이기를 바랍니다. 나는 오버랩 함수에 전달할 때 이미지가 다르고 많은 것을 시도했지만 이미지를 투명하게 만들 수 없다는 것을 확인했습니다. 오버랩 함수는 투명하지만 투명하지 않습니다. 어떤 도움이라도 대단히 감사하겠습니다.BufferedImages를 겹쳐서 투명하게 만듭니다.

public BufferedImage overlay(BufferedImage bii, BufferedImage biii){ 
      BufferedImage combined = new BufferedImage(256, 256, BufferedImage.TYPE_INT_ARGB); 
      Graphics2D go = combined.createGraphics(); 
      image.setSlice(5); 
      ImagePlus hello = new ImagePlus(); 
      hello.setImage(image.getImage()); 
      BufferedImage bello = hello.getBufferedImage(); 
      go.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); 
      go.drawImage(bii,0, 0, null); 
      go.drawImage(biii,98, 98, null); 
      go.setComposite(AlphaComposite.Clear); 
      go.setComposite(AlphaComposite.Src); 
      //go.fillRect(0, 0, 256, 256); 
      go.dispose(); 
      return combined; 
     } 

주요 기능 :

 ImageStack stack = image.getStack(); 
     Calibration cal = image.getCalibration(); 
     ImagePlus newImp = new ImagePlus(); 
     stack.getSliceLabel(5); 
     stack.getProcessor(5); 
     newImp.setCalibration(cal); 
     ImageProcessor ip = stack.getProcessor(1); // specify number of slice 
     newImp.setProcessor(ip); 


     ImagePlus no3 = new ImagePlus(); 
     no3.setImage(newImp.getImage()); 
     BufferedImage bii= no3.getBufferedImage(); 

     ImagePlus bob = new ImagePlus(); 
     stack.getSliceLabel(33); 
     stack.getProcessor(33); 
     bob.setCalibration(cal); 
     ImageProcessor bobp = stack.getProcessor(22); // specify number of slice 
     bob.setProcessor(bobp); 
     ImagePlus hello = new ImagePlus(); 
     hello.setImage(bob.getImage()); 
     BufferedImage bello = hello.getBufferedImage(); 

     BufferedImage overlayy = overlay(bii, bello); 
     frame2 = new NFrame(image.getTitle(), image, save); 
     JPanel pane = new JPanel(new BorderLayout()); 
     JLabel jLabel = new JLabel(new ImageIcon(overlayy)); 
     pane.add(jLabel); 
     frame2.add(pane); 
     frame2.setVisible(true); 
     desktop.add(frame2); 

답변

1

ImageJ에 1.x의 투명 (ARGB) 컬러 이미지에 대한 제한된 지원을 갖는다 (예컨대 here 참조).

ARGB 이미지의 알파 채널을 수정하는 한 가지 방법은 getChannelsetChannel 방법을 ij.process.ColorProcessor으로 사용하는 것입니다. 예를 들어 this BeanShell script을 참조하십시오.

다른 이미지 위에 하나의 이미지를 특정 불투명도로 겹쳐서 두 이미지를 결합하는 더 쉬운 방법은 ImageJ의 overlays을 사용하는 것입니다. 언어>으로 Beanshell을 선택, 당신은 Fiji's script editor에 코드를 붙여 스크립트를 시도 할 수 있습니다

import ij.IJ; 
import ij.gui.ImageRoi; 
import ij.gui.Overlay; 

imp = IJ.openImage("http://imagej.nih.gov/ij/images/leaf.jpg"); 
imp2 = IJ.openImage("http://imagej.nih.gov/ij/images/clown.jpg"); 

ImageRoi roi = new ImageRoi(50, 200, imp2.getProcessor()); 
roi.setZeroTransparent(false); 
roi.setOpacity(0.5); 
ovl = new Overlay(roi); 

imp.setOverlay(ovl); 
imp.show(); 

다음 BeanShell script 두 이미지의 반투명 조합을 보여주는 최소한의 예입니다 (간단합니다 자바로 포팅)을 입력하고 을 누르면 실행이됩니다.

이 결과가 될 것입니다 :

Result of running the beanshell script

이/내보내기 이미지를 저장하려면, 당신은 자바 /으로 Beanshell에>는 이미지> 오버레이를 실행 명령을 평평하게, 또는해야

flattenedImp = imp.flatten(); 
+0

나는 당신이 한 것을 시도했지만 그것은 이미지를 투명하게 만들지 못했습니다. 같은 문제가 여전히 존재합니다. –

+0

내 스크립트의 예상 결과를 보여주는 이미지를 추가했습니다. 위의 beanshell 코드를 실행할 때 얻지는 않습니까? –

+0

좋아, 그래서 imp2.setRoi (roi1)를 사용해서 얻었습니다. 나는 beanshell 코드를 사용하지 않는다. 그래서 나는 그것을 얻지 못했다. 내가 오버레이를 시도했지만 그것은 내 작품을 보이지 않습니다. 또한 두 개 이상의 이미지에 대해이 작업을 수행 할 수 있습니까? –

관련 문제