Я пытаюсь получить преобразование журнала из серого изображения. Но с любым значением c я получаю черное изображение. Есть идеи?преобразование журнала изображений с изображением серого в java
, что мой метод:
/// ---------------------------------- -----------------
общественного статический BufferedImage log_trans (ИНТ [] [] ImageData, ИНТ с) {
BufferedImage LogImage = new BufferedImage(imageData.length, imageData[0].length, BufferedImage.TYPE_BYTE_GRAY);
double temp;
for (int i =0 ; i<imageData.length ; i ++){
for (int j=0 ; j<imageData[0].length ; j++){
int rgb = imageData[i][j];
rgb = (rgb<<16)|(rgb<<8)|(rgb);
temp = Math.log10(rgb+1);
rgb = (int) (c * temp);
LogImage.setRGB(i, j, rgb);
}}
return LogImage;
}
--------------------------------------------------------------
public static int[][] readimage(File filename){
BufferedImage img;
try {
img = ImageIO.read(filename);
// Gray_scaled Image output
int width = img.getWidth();
int height = img.getHeight();
ImagePro.fw=width;
ImagePro.fh = height;
int [][] readimageVal = new int [width][height];
for (int i = 0; i<height ; i++){
for (int j =0 ; j<width ; j++){
Color c = new Color(img.getRGB(j, i));
int r= (int)(c.getRed() * 0.299)&0xff;
int g = (int)(c.getGreen() * 0.587)&0xff;
int b = (int)(c.getBlue() *0.114)&0xff;
int avg = ((r+b+g));
readimageVal[j][i] = avg;
}
}
return readimageVal;
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Jedzej: Спасибо. Я попробовал ваш код, и, как вы сказали, он работает только при очень высоких значениях c. Я уже сделал то, что вы предлагаете в моем методе чтения изображений. Может быть, это связано с моим методом чтения изображений? Я редактирую свой вопрос, добавляя метод чтения изображений. – Nazi
Я только что запустил ваш код. После удаления строки: «rgb = (int) (c * temp)», «Я получил довольно красивое черно-белое изображение. Честно говоря, этот логарифм кажется подозрительным, не могли бы вы дать некоторое объяснение этому алгоритму? Я чувствую, что Math.log не следует применять ко всему значению rgb (так что триплет R, G и B), но для разделения значений R, G и B. Выполняете ли вы какой-то конкретный алгоритм? –
Ух, хорошо, подожди. То, что вы передаете своей функции, уже серое изображение, то, что вы хотите сделать, это применить к нему логарифмическое преобразование. Хорошо. Вы должны применить логарифм к значению, считанному из массива, умножить на «c» и THEN распространить это значение на R, G и B (сдвинув начальное значение). Обратите внимание, что после log (rgb) * c вы можете легко получить значение больше 255, поэтому больше, чем вы можете поместить в один байт, поэтому вы должны, вероятно, закрепить это значение на 255, поэтому Math.min (rgb, 255), в противном случае вы получите почти случайные значения (последние байты некоторых более крупных значений), которые являются бессмысленными. –