Witam, tak jak w tytule, mam problem z programem. Nie mogę dojsc co jest niepoprawne. Program powinien po wywołaniu z konsoli wykonywać podane polecenia. Wszystko co udało mi sie napisać jest w załączniku. Może dodam, że problem był przy nakładaniu filtrów na obraz. Nie był on modyfikowany. Dodatkowo mam problem z sensowną funkcją wyswietl, jakieś sugestie?
1. modul.h:
#ifndef MODUL_H
#define MODUL_H
#define DL_LINII 1024
#define W_OK 0
#define B_NIEPOPRAWNAOPCJA -1 /* kody bledow rozpoznawania opcji */
#define B_BRAKNAZWY -2
#define B_BRAKWARTOSCI -3
#define B_BRAKPLIKU -4
typedef struct{
int form;
int wymx,wymy,szarosci;
int **tab;
}obraz;
typedef struct{
FILE *plik_we, *plik_wy;
int kolorowe,szare,negatyw,progowanie,ppol_czern,ppol_biel,k_gamma,konturowanie,r_poz,r_pion,wyswietlenie,z_poziomow,zapisz,wczytaj;
int prog,prog_biel,prog_czern;
double wsp_gamma;
int w_biel,w_czern;
}opcje;
void wyzeruj_opcje(opcje *wybor);
int przetwarzaj_opcje(int argc, char **argv, opcje *wybor);
int zapisz(FILE *plik_wy,obraz n_obraz);
int wczytaj(FILE *plik_we,obraz *w_obraz);
void wyswietl(char *n_pliku);
void negatyw(obraz w_obraz,obraz n_obraz);
void konturowanie(obraz w_obraz,obraz n_obraz);
void r_poz(obraz w_obraz,obraz n_obraz);
void r_pion(obraz w_obraz,obraz n_obraz);
void progowanie(obraz w_obraz,obraz n_obraz, int prog);
void k_gamma(obraz w_obraz,obraz n_obraz, double wsp_gamma);
void z_poziomow(obraz w_obraz,obraz n_obraz,int w_biel,int w_czern);
void ppol_biel(obraz w_obraz,obraz n_obraz, int prog_biel);
void ppol_czern(obraz w_obraz,obraz n_obraz, int prog_czern);
int tryb_opcje(int argc,char **argv);
#endif
2.modul.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "modul.h"
int i, j; /* Pomocnicze zmienne do tablic */
void wyzeruj_opcje(opcje *wybor){
wybor->plik_we=NULL;
wybor->plik_wy=NULL;
wybor->kolorowe=0;
wybor->szare=0;
wybor->negatyw=0;
wybor->progowanie=0;
wybor->ppol_czern=0;
wybor->ppol_biel=0;
wybor->k_gamma=0;
wybor->konturowanie=0;
wybor->r_poz=0;
wybor->r_pion=0;
wybor->wyswietlenie=0;
wybor->z_poziomow=0;
}
int przetwarzaj_opcje(int argc, char **argv, opcje *wybor) {
int prog,wart_biel,wart_czern,w_czern,w_biel;
double w_gamma;
char *nazwa_pliku_we, *nazwa_pliku_wy;
wyzeruj_opcje(wybor);
wybor->plik_wy=stdout; /* na wypadek gdy nie podano opcji "-o" */
for (i=1; i<argc; i++) {
if (argv[i][0] != '-') /* blad: to nie jest opcja - brak znaku "-" */
return B_NIEPOPRAWNAOPCJA;
switch (argv[i][1]) {
case 'i': { /* opcja z nazwa pliku wejsciowego */
if (++i<argc) { /* wczytujemy kolejny argument jako nazwe pliku */
nazwa_pliku_we=argv[i];
if (strcmp(nazwa_pliku_we,"-")==0) /* gdy nazwa jest "-" */
wybor->plik_we=stdin; /* ustwiamy wejscie na stdin */
else /* otwieramy wskazany plik */
wybor->plik_we=fopen(nazwa_pliku_we,"r");
} else
return B_BRAKNAZWY; /* blad: brak nazwy pliku */
break;
}
case 'o': { /* opcja z nazwa pliku wyjsciowego */
if (++i<argc) { /* wczytujemy kolejny argument jako nazwe pliku */
nazwa_pliku_wy=argv[i];
if (strcmp(nazwa_pliku_wy,"-")==0)/* gdy nazwa jest "-" */
wybor->plik_wy=stdout; /* ustwiamy wyjscie na stdout */
else /* otwieramy wskazany plik */
wybor->plik_wy=fopen(nazwa_pliku_wy,"w");
} else
return B_BRAKNAZWY; /* blad: brak nazwy pliku */
break;
}
case 'd': { /* mamy wyswietlic obraz */
wybor->wyswietlenie=1;
break;
}
case 'n': { /* mamy wykonac negatyw */
wybor->negatyw=1;
break;
}
case 'p': {
if (++i<argc) { /* wczytujemy kolejny argument jako wartosc progu */
if (sscanf(argv[i],"%d",&prog)==1) {
wybor->progowanie=1;
wybor->prog=prog;
} else
return B_BRAKWARTOSCI; /* blad: niepoprawna wartosc progu */
} else
return B_BRAKWARTOSCI; /* blad: brak wartosci progu */
break;
}
case 'c':{
if(++i<argc){
if(sscanf(argv[i],"%d",wart_czern)==1){
wybor->ppol_czern=1;
wybor->w_czern=wart_czern;
}else
return B_BRAKWARTOSCI;
}else
return B_BRAKWARTOSCI;
break;
}
case 'b':{
if(++i<argc){
if(sscanf(argv[i],"%d",wart_biel)==1){
wybor->ppol_biel=1;
wybor->w_biel=wart_biel;
}else
return B_BRAKWARTOSCI;
}else
return B_BRAKWARTOSCI;
break;
}
case 'g':{
if(++i<argc){
if(sscanf(argv[i],"%d",w_gamma)==1){
wybor->k_gamma=1;
wybor->wsp_gamma=w_gamma;
}else
return B_BRAKWARTOSCI;
}else
return B_BRAKWARTOSCI;
break;
}
case 'z':{
if(++i<argc){
if(sscanf(argv[i],"%d %d",w_biel,w_czern)==2){
wybor->z_poziomow=1;
wybor->w_biel=w_biel;
wybor->w_czern=w_czern;
}else
return B_BRAKWARTOSCI;
}else
return B_BRAKWARTOSCI;
break;
}
case 'k': { /* mamy wykonac konturowanie */
wybor->konturowanie=1;
break;
}
case 'x':{
wybor->r_poz=1;
break;
}
case 'y':{
wybor->r_pion=1;
break;
}
default: /* nierozpoznana opcja */
return B_NIEPOPRAWNAOPCJA;
} /*koniec switch */
} /* koniec for */
if (wybor->plik_we!=NULL) /* ok: wej. strumien danych zainicjowany */
return W_OK;
else
return B_BRAKPLIKU; /* blad: nie otwarto pliku wejsciowego */
}
void wyswietl(char *n_pliku){
char polecenie[DL_LINII];
strcpy(polecenie,"display");
strcat(polecenie,n_pliku);
strcat(polecenie,"&");
strcat("%s\n",polecenie);
system(polecenie);
}
int zapisz(FILE *plik_wy,obraz n_obraz){
fprintf(plik_wy,"P2\n%d %d\n%d\n",n_obraz.wymx,n_obraz.wymy,n_obraz.szarosci);
for(i=0;i<n_obraz.wymy;i++){
for(j=0;j<n_obraz.wymx;j++){
fprintf(plik_wy,"%d\n",n_obraz.tab[i][j]);
}
}
}
int wczytaj(FILE *plik_we,obraz *w_obraz) {
char buf[DL_LINII]; /* bufor pomocniczy do czytania naglowka i komentarzy */
int znak; /* zmienna pomocnicza do czytania komentarzy */
int koniec=0; /* czy napotkano koniec danych w pliku */
int l_mag;
/*Sprawdzenie czy podano prawidlowy uchwyt pliku */
if (plik_we==NULL) {
fprintf(stderr,"Blad: Nie podano uchwytu do pliku\n");
return(0);
}
/* Sprawdzenie "numeru magicznego" - powinien byc P2 lub P3 */
if (fgets(buf,DL_LINII,plik_we)==NULL) /* Wczytanie pierwszej linii pliku do bufora */
koniec=1; /* Nie udalo sie? Koniec danych! */
if(((buf[0] != 'P') || (buf[1] != '2') || koniec) && ((buf[0]!='P') || (buf[1]!='3') || koniec))
{ /* Czy jest magiczne "P2" lub "P3"? */
fprintf(stderr, "Blad: To nie jest plik PGM ani obraz PPM \n");
}
l_mag=buf[1];
/* Pominiecie komentarzy */
do {
if ((znak=fgetc(plik_we))=='#') { /* Czy linia rozpoczyna sie od znaku '#'? */
if (fgets(buf,DL_LINII,plik_we)==NULL) /* Przeczytaj ja do bufora */
koniec=1; /* Zapamietaj ewentualny koniec danych */
} else {
ungetc(znak,plik_we); /* Gdy przeczytany znak z poczatku linii */
} /* nie jest '#' zwroc go */
} while (znak=='#' && !koniec); /* Powtarzaj dopoki sa linie komentarza */
/* i nie nastapil koniec danych */
/* Pobranie wymiarow obrazu i liczby odcieni szarosci */
if (fscanf(plik_we,"%d %d %d", &w_obraz->wymx, &w_obraz->wymy, &w_obraz->szarosci)!=3) {
fprintf(stderr,"Blad: Brak wymiarow obrazu lub liczby stopni szarosci\n");
return(0);
}
if(l_mag=='2'){
w_obraz->tab=(int**)malloc(w_obraz->wymy*sizeof(int*));
for(i=0;i<w_obraz->wymy;i++){
w_obraz->tab[i] = (int*)malloc(w_obraz->wymx*sizeof(int));
}
for(i=0;i<w_obraz->wymy;i++){
for(j=0;j<w_obraz->wymx;j++){
if(fscanf(plik_we,"%d",&(w_obraz->tab[i][j]))!=1){
fprintf(stderr,"Blad: Niewlasciwe wymiary obrazu\n");
}
}
}
}
if(l_mag=='3'){
int a,b,c;
w_obraz->tab=(int**)malloc(w_obraz->wymy*sizeof(int*));
for(i=0;i<w_obraz->wymy;i++){
w_obraz->tab[i] = malloc(w_obraz->wymx*sizeof(int));
}
for(i=0;i<w_obraz->wymy;i++){
for(j=0;j<w_obraz->wymx;j++){
if(fscanf(plik_we,"%d %d %d",&a,&b,&c) == 3){
w_obraz->tab[i][j]=(a+b+c)/3;
}
}
}
}
}
void negatyw(obraz w_obraz, obraz n_obraz){
for(i=0;i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
n_obraz.tab[i][j]=(w_obraz.szarosci-(w_obraz.tab[i][j]));
}
}
printf("Wykonano negatyw obrazu\n");
}
void konturowanie(obraz w_obraz,obraz n_obraz){
int x,y;
for(i=0;i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
if(i+1<w_obraz.wymy)
x=1;
else
x=0;
if(j+1<w_obraz.wymx)
y=1;
else
y=0;
n_obraz.tab[i][j]=(x*abs(w_obraz.tab[i+1][j]-w_obraz.tab[i][j])+y*abs(w_obraz.tab[i][j+1]-w_obraz.tab[i][j]))/2;
}
}
printf("Wykonano konturowanie obrazu\n");
}
void r_poz(obraz w_obraz,obraz n_obraz){
for(i=0; i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
n_obraz.tab[i][j]=(w_obraz.tab[i][j-1]+w_obraz.tab[i][j]+w_obraz.tab[i][j+1])/3;
}
}
printf("Wykonano rozmycie poziome obrazu\n");
}
void r_pion(obraz w_obraz,obraz n_obraz){
for(i=0; i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
n_obraz.tab[i][j]=(w_obraz.tab[i-1][j]+w_obraz.tab[i][j]+w_obraz.tab[i+1][j])/3;
}
}
printf("Wykonano rozmycie poziome obrazu\n");
}
void progowanie(obraz w_obraz,obraz n_obraz, int prog){
if(prog<=w_obraz.szarosci && prog>=0){
for(i=0;i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
if(w_obraz.tab[i][j]<=prog)
n_obraz.tab[i][j]=0;
else
n_obraz.tab[i][j]=w_obraz.szarosci;
}
}
printf("Wykonano progowanie obrazu\n");
}
else
printf("Podano zla wartosc progowania\n");
}
void k_gamma(obraz w_obraz,obraz n_obraz, double wsp_gamma){
if(wsp_gamma>0){
for(i=0;i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
n_obraz.tab[i][j]=pow((double)w_obraz.tab[i][j] / w_obraz.szarosci, 1 / wsp_gamma) * w_obraz.szarosci;
}
}
printf("Wykonano korekcje gamma\n");
}
else
printf("Wspolczynnik gamma ma byc dodatni\n");
}
void z_poziomow(obraz w_obraz,obraz n_obraz,int w_biel,int w_czern){
if(w_czern<0 || w_czern>w_obraz.szarosci)
printf("Bledne wartosc czerni\n");
else if(w_biel<0 || w_biel>w_obraz.szarosci)
printf("Bledne wartosc bieli\n");
else{
for(i=0;i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
if(w_czern<w_obraz.tab[i][j] && w_obraz.tab[i][j]<w_biel){
n_obraz.tab[i][j]=((w_obraz.tab[i][j]-w_czern)*(w_obraz.szarosci/(w_biel-w_czern)));
}
else if(w_obraz.tab[i][j]<=w_czern)
n_obraz.tab[i][j]=0;
else
n_obraz.tab[i][j]=w_obraz.szarosci;
}
}
printf("Wykonano zmiane poziomow\n");
}
}
void ppol_biel(obraz w_obraz,obraz n_obraz, int prog){
if(prog<=w_obraz.szarosci && prog>=0){
for(i=0;i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
if(w_obraz.tab[i][j]<=prog)
n_obraz.tab[i][j]=w_obraz.tab[i][j];
else
n_obraz.tab[i][j]=w_obraz.szarosci;
}
}
printf("Wykonano polprogowanie bieli w obrazie\n");
}
else
printf("Podano zla wartosc progu bieli\n");
}
void ppol_czern(obraz w_obraz,obraz n_obraz, int prog){
if(prog<=w_obraz.szarosci && prog>=0){
for(i=0;i<w_obraz.wymy;i++){
for(j=0;j<(w_obraz.form*w_obraz.wymx); j+=w_obraz.form){
if(w_obraz.tab[i][j]<=prog)
n_obraz.tab[i][j]=0;
else
n_obraz.tab[i][j]=w_obraz.tab[i][j];
}
}
printf("Wykonano polprogowanie czerni w obrazie\n");
}
else
printf("Podano zla wartosc progu czerni\n");
}
3.tryb_opcje.c:
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "modul.h"
int i, j;
int modyfikacja=0; /* Zmienna mĂłwiaca funkcjom, z ktĂłrej tablicy korzystac.0 - w_obraz, 1 - n_obraz */
int odczytano=0;
int tryb_opcje(int argc, char **argv){
obraz stary_obraz,nowy_obraz;
opcje opcje;
if(W_OK != przetwarzaj_opcje(argc,argv,&opcje)){
fprintf(stderr,"Nie udalo sie wczytac parametrow. \n");
return B_NIEPOPRAWNAOPCJA;
}
if(opcje.plik_we==NULL){
fprintf(stderr,"Nie udalo sie wczytac pliku. \n");
return B_BRAKPLIKU;
}
if (opcje.plik_we != NULL) { /* co spowoduje zakomentowanie tego warunku */
odczytano = wczytaj(opcje.plik_we, &stary_obraz);
fclose(opcje.plik_we);
modyfikacja = 0; /* Poniewaz wczytano nowy obraz */
}
/* ZAPIS */
if(odczytano!=0){
if(modyfikacja==0){
zapisz(opcje.plik_wy,stary_obraz);
}
else{
zapisz(opcje.plik_wy,nowy_obraz);
for(i=0;i<nowy_obraz.wymy;i++){
free(nowy_obraz.tab[i]);
}
}
fclose(opcje.plik_wy);
}
else
fprintf(stderr,"Blad: Nie ma pliku!\n");
if(odczytano != 0) {
for(i=0; i<stary_obraz.wymy; i++) {
free(stary_obraz.tab[i]);
}
}
if(opcje.wyswietlenie==1){
/* UWAGA - brak pomysłu na inne */
wyswietl(argv[4]);
}
if(opcje.negatyw==1){
if(modyfikacja==0){
negatyw(stary_obraz,nowy_obraz);
modyfikacja=1;
}
else
negatyw(nowy_obraz,nowy_obraz);
}
if(opcje.konturowanie==1){
if(modyfikacja==0){
konturowanie(stary_obraz,nowy_obraz);
modyfikacja=1;
}
else
konturowanie(nowy_obraz,nowy_obraz);
}
if(opcje.r_poz==1){
if(modyfikacja==0){
r_poz(stary_obraz,nowy_obraz);
modyfikacja=1;
}
else
r_poz(nowy_obraz,nowy_obraz);
}
if(opcje.r_pion==1){
if(modyfikacja==0){
r_pion(stary_obraz,nowy_obraz);
modyfikacja=1;
}
else
r_pion(nowy_obraz,nowy_obraz);
}
if(opcje.progowanie==1){
if(modyfikacja==0){
progowanie(stary_obraz,nowy_obraz, opcje.prog);
modyfikacja=1;
}
else
progowanie(nowy_obraz,nowy_obraz, opcje.prog);
}
if(opcje.k_gamma==1){
if(modyfikacja==0){
k_gamma(stary_obraz,nowy_obraz, opcje.wsp_gamma);
modyfikacja=1;
}
else
k_gamma(nowy_obraz,nowy_obraz, opcje.wsp_gamma);
}
if(opcje.z_poziomow==1){
if(modyfikacja==0){
z_poziomow(stary_obraz,nowy_obraz,opcje.w_biel, opcje.w_czern);
modyfikacja=1;
}
else
z_poziomow(nowy_obraz,nowy_obraz,opcje.w_biel, opcje.w_czern);
}
if(opcje.ppol_biel==1){
if(modyfikacja==0){
ppol_biel(stary_obraz,nowy_obraz, opcje.prog_biel);
modyfikacja=1;
}
else
ppol_biel(nowy_obraz,nowy_obraz, opcje.prog_biel);
}
if(opcje.ppol_czern==1){
if(modyfikacja==0){
ppol_czern(stary_obraz,nowy_obraz, opcje.prog_czern);
modyfikacja=1;
}
else
ppol_czern(nowy_obraz,nowy_obraz, opcje.prog_czern);
}
return W_OK;
}
4. main.c:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <math.h>
#include "modul.h"
int main(int argc, char ** argv) {
tryb_opcje(argc,argv);
}