Usunięcie danego koloru z bitmapy

0

Witam serdecznie!
Mam problem, potrzebuję usunąć niebieskie tło (a raczej wszystko, co nie jest koloru zielonego) z obrazka, który zamieszczam poniżej.
http://imgur.com/a/KE3AJ

Jest to obraz zapisany w formacie bitmapy (.bmp). Kod programu zamieszczam poniżej. Proszę o wskazówki, co zrobić (ewentualnie co zmienić w moim kodzie).

#include <stdio.h>
#include <stdlib.h>

typedef unsigned int uint;
typedef unsigned short ushort;
typedef unsigned char uchar;

typedef struct {
	ushort Signature;
	uint FileSize;
	uint Reserved;
	uint Offset;
} BMPFILEHEADER;

typedef struct {
	uint HeaderSize;
	uint Width;
	uint Height;
	ushort PlaneCount;
	ushort BitDepth;
	uint Compression;
	uint CompressedImageSize;
	uint HorizontalResolution;
	uint VerticalResolution;
	uint NumColors;
	uint ImportantColors;
} BMPIMAGEINFO;

typedef struct {
	uchar Blue;
	uchar Green;
	uchar Red;
} RGBs;

int main()
{
	FILE *Image;
	FILE *ChangedImage;
	Image = fopen("1a15+50-107mg.bmp", "rb");

	if (!Image)
	{
		return NULL;
	}

	BMPFILEHEADER *Header;
	BMPIMAGEINFO *Info;
	RGBs *RGB, **Pixel;

	Header = (BMPFILEHEADER*)malloc(sizeof(BMPFILEHEADER));
	Info = (BMPIMAGEINFO*)malloc(sizeof(BMPIMAGEINFO));
	RGB = (RGBs*)malloc(sizeof(RGBs));

	if (Header == NULL)
	{
		return NULL;
	}

	if (Info == NULL)
	{
		return NULL;
	}

	if (RGB == NULL)
	{
		return NULL;
	}

	fread(&Header->Signature, sizeof(Header->Signature), 1, Image);
	fread(&Header->FileSize, sizeof(Header->FileSize), 1, Image);
	fread(&Header->Reserved, sizeof(Header->Reserved), 1, Image);
	fread(&Header->Offset, sizeof(Header->Offset), 1, Image);

	fread(&Info->HeaderSize, sizeof(Info->HeaderSize), 1, Image);
	fread(&Info->Width, sizeof(Info->Width), 1, Image);
	fread(&Info->Height, sizeof(Info->Height), 1, Image);
	fread(&Info->PlaneCount, sizeof(Info->PlaneCount), 1, Image);
	fread(&Info->BitDepth, sizeof(Info->BitDepth), 1, Image);
	fread(&Info->Compression, sizeof(Info->Compression), 1, Image);
	fread(&Info->CompressedImageSize, sizeof(Info->CompressedImageSize), 1, Image);
	fread(&Info->HorizontalResolution, sizeof(Info->HorizontalResolution), 1, Image);
	fread(&Info->VerticalResolution, sizeof(Info->VerticalResolution), 1, Image);
	fread(&Info->NumColors, sizeof(Info->NumColors), 1, Image);
	fread(&Info->ImportantColors, sizeof(Info->ImportantColors), 1, Image);

	ChangedImage = fopen("changed.bmp", "wb");
	if (ChangedImage == NULL)
	{
		return NULL;
	}

	fwrite(&Header->Signature, sizeof(Header->Signature), 1, ChangedImage);
	fwrite(&Header->FileSize, sizeof(Header->FileSize), 1, ChangedImage);
	fwrite(&Header->Reserved, sizeof(Header->Reserved), 1, ChangedImage);
	fwrite(&Header->Offset, sizeof(Header->Offset), 1, ChangedImage);

	fwrite(&Info->HeaderSize, sizeof(Info->HeaderSize), 1, ChangedImage);
	fwrite(&Info->Width, sizeof(Info->Width), 1, ChangedImage);
	fwrite(&Info->Height, sizeof(Info->Height), 1, ChangedImage);
	fwrite(&Info->PlaneCount, sizeof(Info->PlaneCount), 1, ChangedImage);
	fwrite(&Info->BitDepth, sizeof(Info->BitDepth), 1, ChangedImage);
	fwrite(&Info->Compression, sizeof(Info->Compression), 1, ChangedImage);
	fwrite(&Info->CompressedImageSize, sizeof(Info->CompressedImageSize), 1, ChangedImage);
	fwrite(&Info->HorizontalResolution, sizeof(Info->HorizontalResolution), 1, ChangedImage);
	fwrite(&Info->VerticalResolution, sizeof(Info->VerticalResolution), 1, ChangedImage);
	fwrite(&Info->NumColors, sizeof(Info->NumColors), 1, ChangedImage);
	fwrite(&Info->ImportantColors, sizeof(Info->ImportantColors), 1, ChangedImage);


	int i, j;
	Pixel = (RGBs**)malloc(sizeof(RGBs*) * Info->Height);

	for (i = 0; i < Info->Height; i++)
	{
		Pixel[i] = (RGBs*)malloc(sizeof(RGBs)*Info->Width);
	}

       // tutaj nastepuje odczyt i sprawdzenie w instrukcji warunkowej, czy jestesmy na kolorze innym niz zielony - jesli tak to zmieniamy kolor na bialy (255,255,255) i zapisujemy w nowej 
      bitmapie
	for (i = 0; i < Info->Height; i++)
	{
		for (j = 0; j < Info->Width; j++)
		{
			fread(&Pixel[i][j].Blue, sizeof(RGB->Blue), 1, Image);
			fread(&Pixel[i][j].Green, sizeof(RGB->Green), 1, Image);
			fread(&Pixel[i][j].Red, sizeof(RGB->Red), 1, Image);
			if (Pixel[i][j].Green < 30)
			{
				Pixel[i][j].Blue = 255;
				Pixel[i][j].Green = 255;
				Pixel[i][j].Red = 255;
			}
			fwrite(&Pixel[i][j].Blue, sizeof(RGB->Blue), 1, ChangedImage);
			fwrite(&Pixel[i][j].Green, sizeof(RGB->Green), 1, ChangedImage);
			fwrite(&Pixel[i][j].Red, sizeof(RGB->Red), 1, ChangedImage);

		}
	}

	printf("Typ: %x", Header->Signature);
	printf("\nRozmiar pliku : %d bajtow", Header->FileSize);
	printf("\nZarezerwowane miejsca: %d", Header->Reserved);
	printf("\nPozycja danych obrazkowych: %d", Header->Offset);

	printf("\n\nWielkosc naglowka informacyjnego: %d", Info->HeaderSize);
	printf("\nSzerokosc: %d pikseli", Info->Width);
	printf("\nWysokosc: %d pikseli", Info->Height);
	printf("\nLiczba platow (zwykle 0): %d", Info->PlaneCount);
	printf("\nLiczba bitow na piksel: %d", Info->BitDepth);
	printf("\nKompresja: %d", Info->Compression);
	printf("\nRozmiar samego rysunku: %d", Info->CompressedImageSize);
	printf("\nRozdzielczosc pozioma: %d", Info->HorizontalResolution);
	printf("\nRozdzielczosc pionowa: %d", Info->VerticalResolution);
	printf("\nLiczba kolorow w palecie: %d", Info->NumColors);
	printf("\nWazne kolory w palecie: %d", Info->ImportantColors);

	free(Header);
	free(Info);
	free(RGB);
	free(Pixel);
	fclose(Image);
	fclose(ChangedImage);
	return 0;
}
0

Zmień warunek:

if (Pixel[i][j].Green < 30)

na:

if (Pixel[i][j].Green < Pixel[i][j].Blue)
0

A co to jest 'zielony' kolor?

twój genialny warunek: Green < 30

znaczy tyle że np. r,g,b = 0,0,0, czyli perfekt czarny jest zielony!

0

Ja bym to robił inaczej. Po pierwsze użyłbym zewnętrznej biblioteki np opencv.
Odpada ci wtedy wczytywanie i zapisywania danych bo biblioteka zrobi to za ciebie.
Na dodatek biblioteka ma rożne funkcje manipulowania kolorami.
Po po pierwsze zmieniłbym RGB na CIELab następnie zrobił dyskryminację tła (pewnie powinieneś też zrobić detekcję krawędzi).

1 użytkowników online, w tym zalogowanych: 0, gości: 1