Растровое изображение — Подсчет одинаковых значений bmp до значения в пикселях Переполнение стека

Я взял растровое изображение и вытащил из него R, G, B для указанного ряда пикселей. Преобразовал int в строку, чтобы я мог напечатать мои 6 конкретных цветов. Я не мог понять, как это сделать с помощью int.

Эта проблема
Я могу напечатать строку 0-184 (соответствующую пикселям в этой строке) в виде последовательных данных 1234 … или цвет красный, красный, красный, черный, черный, серый ….

Однако мне нужно считать одинаковые / одинаковые цвета, отображать сумму одинаковых цветов и сбрасывать счетчик, пока этот цвет не появится снова, а затем пересчитать. Я думал, если или если бы еще сделал это, но не совсем. Может быть, моя структура кода вызывает проблемы?

Итак, что я хочу:

5   red,
10  black,
2   red,
1   gray,

так далее……

Вот мой код, я новичок, поэтому критикую за недостаток знаний, чтобы я мог учиться правильно.

#include <iostream>
#include <sstream>
#include <string>
#include "EasyBMP.h"#include "EasyBMP_BMP.h"#include "EasyBMP_DataStructures.h"#include "EasyBMP_VariousBMPutilities.h"
//Conversion and comparison function
void calculate(int i, int x, int p);

int main(int argc, const char * argv[])
{

BMP Image;
Image.ReadFromFile( "BMP GOES HERE 24bit" );

std::cout << "Image Height and Width: " << Image.TellHeight() << " x " << Image.TellWidth() << std::endl;

std::cout << "Enter your row: ";

int pixX = 0;
std::cin >> pixX;

//Set getpixel to top of row
int pixY  = 0;

for( pixY = 0; pixY < Image.TellHeight() ; pixY++ )
{
std::cout << "Pixel: " << pixY + 1;

RGBApixel Temp = Image.GetPixel(pixX,pixY);

//Array to store pixel color ints
int pixy[3];
pixy[0] = Temp.Red;
pixy[1] = Temp.Green;
pixy[2] = Temp.Blue;

calculate(pixy[0], pixy[1], pixy[2]);
}

return 0;
}void calculate(int rnum, int gnum, int bnum)
{

//String which will contain the result
std::string result;

//Stream used for the conversion
std::ostringstream convert;

//Insert the textual representation of 'Number' in the characters in the stream
convert << rnum;

convert << gnum;

convert << bnum;

// set 'Result' to the contents of the stream
result = convert.str();

// compare result to my given value
if (result == "25500")
{
std::cout << " RED  " << std::endl;
}
if (result == "255255255")
{
std::cout << " WHITE " << std::endl;
}
if (result == "000")
{
std::cout << " BLACK" << std::endl;
}
if (result == "148148148")
{
std::cout << " GRAY " << std::endl;
}
if (result == "267326")
{
std::cout << " GREEN " << std::endl;
}
if (result == "2551260")
{
std::cout << " ORANGE " << std::endl;
}
}

Ниже приведен рабочий код. Обратите внимание, что если вы используете его, мое изображение имеет только 6 конкретных цветов. Чтобы изменить распечатку, необходимо изменить регистр операторов переключения по желанию.

#include <iostream>
#include <vector>
#include "EasyBMP.h"#include "EasyBMP_BMP.h"#include "EasyBMP_DataStructures.h"#include "EasyBMP_VariousBMPutilities.h"
long toRGB(long red, long grn, long blu);int main(int argc, const char * argv[])
{

BMP Image;
Image.ReadFromFile( "Your BMP HERE" );

std::cout << "Image Height and Width: " << Image.TellHeight() << " x " << Image.TellWidth() << std::endl;

std::cout << "Enter your row: ";

int pixX = 0;
std::cin >> pixX;
if (pixX != 0)                              //Subtract one from input if not 0, image starts at 0,0
{
pixX -= 1;
}

long pop  = 0;
long pop1 = 0;

RGBApixel current = Image.GetPixel(pixX,0);

long pixy1[3];                                        //Array to store pixel color ints
pixy1[0] = current.Red;
pixy1[1] = current.Green;
pixy1[2] = current.Blue;

pop1 = toRGB(pixy1[0], pixy1[1], pixy1[2]);int count = 0;
for( int pixY = 0; pixY < Image.TellHeight() ; pixY++ )
{
RGBApixel Temp = Image.GetPixel(pixX,pixY);

long pixy[3];                                        //Array to store pixel color ints
pixy[0] = Temp.Red;
pixy[1] = Temp.Green;
pixy[2] = Temp.Blue;

pop = toRGB(pixy[0], pixy[1], pixy[2]);

if (pop == pop1)
{
count++;
}
else
{
switch (pop1) {
case 0:
std::cout << "(" << count << ")\t" << "BLACK\n" << std::endl;
break;
case 16711680:
std::cout << "(" << count << ")\t" << "RED\n" << std::endl;
break;
case 9737364:
std::cout << "(" << count << ")\t" << "GRAY\n" << std::endl;
break;
case 16777215:
std::cout << "(" << count << ")\t" << "WHITE\n" << std::endl;
break;
case 1722650:
std::cout << "(" << count << ")\t" << "GREEN\n" << std::endl;
break;
case 16743936:
std::cout << "(" << count << ")\t" << "ORANGE\n" << std::endl;
break;
default:
std::cout << " !!!NO Specified COLOR For!!! " << pop1 << std::endl;
break;
}

pop1 = pop;                                     //Reset the count and current     color
count = 1;
}
}
if (count > 0)                                      //Returns last color and count
{
switch (pop1) {
case 0:
std::cout << "(" << count << ")\t" << "BLACK\n" << std::endl;
break;
case 16711680:
std::cout << "(" << count << ")\t" << "RED\n" << std::endl;
break;
case 9737364:
std::cout << "(" << count << ")\t" << "GRAY\n" << std::endl;
break;
case 16777215:
std::cout << "(" << count << ")\t" << "WHITE\n" << std::endl;
break;
case 1722650:
std::cout << "(" << count << ")\t" << "GREEN\n" << std::endl;
break;
case 16743936:
std::cout << "(" << count << ")\t" << "ORANGE\n" << std::endl;
break;
default:
std::cout << " !!!NO Specified COLOR For!!! " << pop1 << std::endl;
break;
}
}

return 0;
}

long toRGB(long a, long b, long c)                          //Function to convert R, G, B      values to unique value
{
long color = 0;
color |= (a & 255) << 16;
color |= (b & 255) << 8;
color |= (c & 255);

return color;
}

1

Решение

Я не очень понял ваш вопрос раньше, поэтому я написал новый ответ, более соответствующий тому, что вы спрашиваете.

Я думаю, что вы можете получить то, что вы хотите с чем-то вроде этого (изменение вашего кода):

RGBApixel current = Image.GetPixel(pixX,0);
int count = 0;
for( pixY = 0; pixY < Image.TellHeight() ; pixY++ )
{
RGBApixel Temp = Image.GetPixel(pixX,pixY);
if (Temp == current)
{
count++;
}
else
{
// same-color sequence ended
// Add code here to print out current color and count
--- your output code ----

// now reset the count and current color
current = Temp;
count = 1;
}
}

// Now just print out the last sequence
if (count > 0)
{
--- your output code here again ---
}

Одна вещь, в которой я не уверен, это то, как, если вообще, == Оператор определен для RGBApixel. Если он не определен или не соответствует пикселям в зависимости от их цвета, просто напишите такую ​​функцию, как pixelsAreEqual(RBGApixel p1, RGBApixel p2) это берет два пикселя и возвращает истину, если они имеют одинаковые значения RGB.

0

Другие решения

Существует множество различных способов подсчета количества пикселей данного цвета. Если есть довольно короткий список цветов, которые вас интересуют, вы можете создать массив размером, равным количеству цветов, инициализированных для всех 0, а затем написать функцию, которая возвращает индекс этого массива на основе цвета, переданного в он (например, red = 0, white = 1, в произвольном порядке; константы, вероятно, являются хорошим способом отследить его), затем циклически перемещается по пикселям, вызывая функцию для каждого из них и увеличивая массив по указанному индексу.

Это просто, но крайне не элегантно.

0

По вопросам рекламы [email protected]