Я загружаю изображение в консольное приложение, используя Image.FromFile
.
После этого я привожу его к Bitmap
, чтобы иметь возможность использовать метод Bitmap.GetPixel()
.
Удивительно, но при переборе всех пикселей все, что я получаю от GetPixel
, это 0,0,0 для R,G,B.
Чтобы убедиться, что изображение хорошо читается из файла, я добавил ссылку на System.Windows.Forms
и загрузил изображение внутри PictureBox
, чтобы увидеть результат, и изображение хорошо видно.
Исходное изображение:
Вот как я загружаю изображение и показываю его в PictureBox
:
Bitmap img = (Bitmap)Image.FromFile("image.png");
PictureBox pb = new PictureBox
{
Image = img
};
Form frm = new Form
{
Controls = { pb }
};
frm.ShowDialog();
Что показывает изображение, как оно есть:
И после этого я получаю такие пиксели, как:
byte[] input = new byte[784];
for (int x = 0; x < 28; x++)
{
for (int y = 0; y < 28; y++)
{
Color color = img.GetPixel(x, y);
byte r = color.R;
byte g = color.G;
byte b = color.B;
Console.Write($"{color.R},{color.G},{color.B}|||");
input[x * 28 + y] = (byte)((((r + g + b) / 3)));
}
Console.WriteLine();
}
Обратите внимание, что размер изображения составляет 28x28 пикселей, и я пробовал другие изображения, и у меня был тот же результат.
Я ожидал, что результаты показывают реальные значения цвета, так как я использовал этот метод раньше, и он работал отлично, но теперь все результаты, выведенные на консоль, представляют собой нули, которые мне трудно понять.
Поскольку PictureBox
показывает реальное представление изображения, я попытался получить пиксели из PictureBox.Image
, например:
Color color = ((Bitmap)pb.Image).GetPixel(x, y);
Это также не сработало, и результаты вернулись как нули.
В чем может быть причина этого и как это исправить?
@A.A.Потому что мне не нужно ничего показывать. Это просто материал для тестирования машинного обучения, и мне нужны только данные изображения.
Какое расширение файла вы использовали раньше, когда оно работало? Не могли бы вы проверить свой алгоритм с файлом JPG, пожалуйста,
@A.A.I использовал его раньше с JPG и PNG, и он всегда работал, даже внутри консольного приложения.
Идея: откройте свое изображение в Paint или GIMP и проверьте значение RGB случайного пикселя.
Значит, это не работает только с этим одним изображением? Какие подробности? (Размер и глубина пикселей)
@TaW Размер изображения 28x28, и я не подумал попробовать другое изображение. Я просто сделал это и получил тот же результат. Я также добавил эту информацию в вопрос для получения дополнительных разъяснений.
@PaulKaram Можешь попробовать с JPG?
Фотошоп или другая программа? Если у вас есть PhotoShop, откройте и сохраните его снова. Посмотрим, что выйдет (полагаю наоборот, все белый). Важно значение альфа.
Фактический цвет [0,255,255,255]
или [0,0,0,0]
. Все прозрачно.
@Jimi После открытия его в Photoshop и повторного сохранения он получился таким же, как файл. Но когда я попробовал в коде, он действительно дал правильные значения.
Примечание. Ваше изображение прозрачное + черное. Если не оценивать альфа-канал, все пиксели казаться черные. Более менее. Есть полупрозрачные пиксели. Однако он может просто изменить значение Alpha для их представления. Разные техники.
Пожалуйста, опубликуйте фактическое изображение png!
@TaW Добавлено в пост и вот ссылка: i.stack.imgur.com/9BJBI.png
@PaulKaram Изображение черное из-за прозрачности, RGB выдает (0,0,0), что является черным и в данном случае правильным. Попробуйте использовать значения RGB 4-го измерения, чтобы вы также могли получить альфа-значения.
Спасибо. В нем действительно только черные пиксели. Многие из них прозрачны, что позволит задний цвет просвечивает изображения. Но все пиксели черные с разными значениями альфы. Вы можете использовать это как индикатор настоящего и фальшивого черного цвета. Так что добавляйте color.A
в свои тесты!!
Вы можете использовать color.A в качестве меры того, сколько фактического цвета и сколько фонового цвета вы выбрали, будет использоваться. Таким образом, расчет может выглядеть так: red = ((255- color.A) * backcolor.R + color.red * color.A )
@TaW Спасибо за всю информацию. Если вы хотите опубликовать это как ответ, я буду более чем счастлив принять :)
В вашем изображении все цветовые каналы всех пикселей являются0
, так что ваш код на самом деле работает нормально.
И у большинства пикселей также есть alpha
из 0
, поэтому они прозрачный. Некоторые из них полупрозрачные, со сглаженными пикселями, а некоторые полностью непрозрачны.
Там, где есть прозрачные или полупрозрачные пиксели, фон будет просвечиваться.
Если вы хотите распознать действительно непрозрачные черные пиксели, вам также необходимо проверить альфа-канал.
Вот функция, которая создаст составной цвет цвета пикселя и заданного цвета фона..:
Color Composite(Color color, Color backcolor)
{
byte r = (byte)(((255 - color.A) * backcolor.R + color.R * color.A) / 256);
byte g = (byte)(((255 - color.A) * backcolor.G + color.G * color.A) / 256);
byte b = (byte)(((255 - color.A) * backcolor.B + color.B * color.A) / 256);
Color c2 = Color.FromArgb(255, r, g, b);
return c2;
}
Если вам нужна яркость одного из ваших пикселей, вы можете создать композицию его цвета с белым. Но, учитывая изображение, которое у вас есть, вы могли бы также использовать color.A
напрямую..
Почему это консольное приложение?