Documentation

This is machine translation

Translated by Microsoft
Mouseover text to see original. Click the button below to return to the English verison of the page.

Note: This page has been translated by MathWorks. Please click here
To view all translated materals including this page, select Japan from the country navigator on the bottom of this page.

imlincomb

Linear combination of images

Syntax

Z = imlincomb(K1,A1,K2,A2,...,Kn,An)
Z = imlincomb(K1,A1,K2,A2,...,Kn,An,K)
Z = imlincomb(___,output_class)
gpuarrayZ = imlincomb(gpuarrayK,gpuarrayA,___,output_class)

Description

Z = imlincomb(K1,A1,K2,A2,...,Kn,An) computes

K1*A1 + K2*A2 + ... + Kn*An

where K1, K2, through Kn are real, double scalars and A1, A2, through An are real, nonsparse, numeric arrays with the same class and size. Z has the same class and size as A1 unless A1 is logical, in which case Z is double.

Z = imlincomb(K1,A1,K2,A2,...,Kn,An,K) computes

K1*A1 + K2*A2 + ... + Kn*An + K

where imlincomb adds K, a real, double scalar, to the sum of the products of K1 through Kn and A1 through An.

Z = imlincomb(___,output_class) lets you specify the class of Z. output_class is a character vector containing the name of a numeric class.

gpuarrayZ = imlincomb(gpuarrayK,gpuarrayA,___,output_class) performs the operation on a GPU, where the input values,gpuarrayK and gpuarrayA, are gpuArrays and the output value, gpuarrayZ is a gpuArray. This syntax requires the Parallel Computing Toolbox™

When performing a series of arithmetic operations on a pair of images, you can achieve more accurate results if you use imlincomb to combine the operations, rather than nesting calls to the individual arithmetic functions, such as imadd. When you nest calls to the arithmetic functions, and the input arrays are of an integer class, each function truncates and rounds the result before passing it to the next function, thus losing accuracy in the final result. imlincomb computes each element of the output Z individually, in double-precision floating point. If Z is an integer array, imlincomb truncates elements of Z that exceed the range of the integer type and rounds off fractional values.

Examples

collapse all

Read an image into the workspace.

I = imread('cameraman.tif');

Scale the image using a coefficient of 1.5 in the linear combination.

J = imlincomb(1.5,I);

Display the original image and the processed image.

imshow(I)

figure
imshow(J)

Read an image into the workspace.

I = imread('cameraman.tif');

Create a low-pass filtered copy of the image.

J = uint8(filter2(fspecial('gaussian'), I));

Find the difference image and shift the zero value to 128 using a linear combination of I and J.

K = imlincomb(1,I,-1,J,128); %K(r,c) = I(r,c) - J(r,c) + 128

Display the resulting difference image.

imshow(K)

Read two grayscale uint8 images into the workspace.

I = imread('rice.png');
J = imread('cameraman.tif');

Add the images using a linear combination. Specify the output as type uint16 to avoid truncating the result.

K = imlincomb(1,I,1,J,'uint16');

Display the result.

imshow(K,[])

Read two grayscale uint8 images into the workspace and convert them to GPUarrays.

I = gpuArray(imread('rice.png'));
J = gpuArray(imread('cameraman.tif'));

Add the images using a linear combination on a GPU. Specify the output as type uint16 to avoid truncating the result.

K = imlincomb(1,I,1,J,'uint16');

Display the result.

figure
imshow(K,[])

This example shows the difference between nesting calls and using linear combinations when performing a series of arithemetic operations on images. To illustrate how imlincomb performs all the arithmetic operations before truncating the result, compare the results of calculating the average of two arrays, X and Y, using nested arithmetic functions and using imlincomb.

Create two arrays.

X = uint8([ 255 0 75; 44 225 100]);
Y = uint8([ 50 50 50; 50 50 50 ]);

Average the arrays using nested arithmetic functions. To calculate the average returned in Z(1,1), the function imadd adds 255 and 50 and truncates the result to 255 before passing it to imdivide. The average returned in Z(1,1) is 128.

Z = imdivide(imadd(X,Y),2)
Z = 2x3 uint8 matrix

   128    25    63
    47   128    75

In contrast, imlincomb performs the addition and division in double precision and only truncates the final result. The average returned in Z2(1,1) is 153.

Z2 = imlincomb(.5,X,.5,Y)
Z2 = 2x3 uint8 matrix

   153    25    63
    47   138    75

Extended Capabilities

Introduced before R2006a

Was this topic helpful?