Получение всего темного выходного изображения - PullRequest
0 голосов
/ 09 июля 2020

Если я удалю uint8, когда я даю матрице B ее размер, я получаю результат, который затеняется красной плоскостью. Я также добавил [] в imshow(B, []), чтобы решить проблему вывода всего темного цвета, но это не помогает.

function myThirdAssignment(I,WindowSize,K0,K1,K2)

%if size(I,3)==1
 

 %[rows, columns, numberOfColorChannels] = size(I);
 
%elseif size(I,3)==3
    
x= im2double(imread(I));
%gray1=rgb2gray(x);
%[r, c, numberOfColorChannels] = size(gray1);
%end


if nargin==1 % If number of arguments of the function are equal to 1 then use 
             % the following default values for K0,K1,K2, & Window size.
    K0= 0.5;
    
    K1= 1;
    
    K2= 0.5;
    
    WindowSize=3;
end

figure(1); imshow(x); title('ORIGINAL IMAGE');
imwrite(x,'OriginalImage.bmp.bmp'); %writing data of original image in to current directory.

% GIVING B THE SAME ROWS AND COLUMS AS THE ORIGINAL IMAGE
[rows, columns, numberOfColorChannels] = size(x);
B = zeros(rows, columns, numberOfColorChannels, 'uint8');


% CALCULATING CEIL & FLOOR VALUES TO MAKE PROGRAM MORE GENERAL
p= ceil((WindowSize / 2)); %3/2= 1.5=2


s= floor((WindowSize / 2)); %3/2=1.5=1



        
        
        
        
           
            B(i,j)= 2*x(i,j);
            
        
        
        else
            B(i,j)= x(i,j);
        end
    
        %--------------------------------------------
        
    end


end

%RGB = cat(3, B, B, B);
figure(2);imshow(B, []); title('IMAGE AFTER LOCAL HISTOGRAM EQUALIZATION');
imwrite(B,'enhancedImage.jpeg.jpeg'); %writing data of enhanced image in to current directory

end

Я использовал это изображение как ввод.

Ответы [ 2 ]

1 голос
/ 09 июля 2020

Здесь есть две проблемы: а) проблема uint8, которую вы уже решили, которая преобразует двойные значения в uint8, который округляет все до 0, что приводит к темному изображению, и б) результирующее красное изображение, которое возникает, потому что вы только выполнение локального выравнивания гистограммы на красном канале входного изображения x, а зеленый и синий каналы в выходном изображении - нули.

Измените свой код на этот:

if avg <= K0*(meanIntensity) && (K1*(stdG) <= std) && (std <= K2*(stdG))
           % only enhance an area of defined window size when its mean/average is 
           % lesser than or equal to the mean of the image by some constant
           % K0 AND its standard deviation is lesser than the value of the
           % standard deviation by a constant K2 and greater than the
           % global standard deviation by a constant K1.
           
            B(i,j,1)= 2*x(i,j,1);
            B(i,j,2)= 2*x(i,j,2);
            B(i,j,3)= 2*x(i,j,3);
        
        
        else
            B(i,j,1)= x(i,j,1);
            B(i,j,2)= x(i,j,2);
            B(i,j,3)= x(i,j,3);
        end
0 голосов
/ 09 июля 2020

x является двойным (im2double), что означает, что его значения находятся в диапазоне от 0 до 1.

Вы сохраняете его как целое число без знака от 0 до 255, B. Как целое число без знака, он обрезает все десятичные разряды и округляет до ближайшего целого числа, равного 0. Таким образом, B(i,j)= x(i,j) всегда равно нулю.

Вы можете иметь в виду B(i,j)= x(i,j)*255?

Или даже лучше, просто всегда работайте с числами типа double, а затем конвертируйте int перед сохранением, если это необходимо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...