diff --git a/examples/image.jl b/examples/image.jl index e4049c01fc304..ce2afd0355a94 100644 --- a/examples/image.jl +++ b/examples/image.jl @@ -131,7 +131,7 @@ end imshow(img) = imshow(img, []) -function imadjustintensity(img, range) +function imadjustintensity{T}(img::Array{T,2}, range) if length(range) == 0 range = [min(img) max(img)] elseif length(range) == 1 @@ -199,8 +199,16 @@ end imlaplacian() = imlaplacian("nodiagonals") +# more general version +function imlaplacian(alpha::Number) + lc = alpha/(1 + alpha) + lb = (1 - alpha)/(1 + alpha) + lm = -4/(1 + alpha) + return [lc lb lc; lb lm lb; lc lb lc] +end + # 2D gaussian filter kernel -function gaussian2d(sigma, filter_size) +function gaussian2d(sigma::Number, filter_size) if length(filter_size) == 0 # choose 'good' size m = 4*ceil(sigma)+1 @@ -217,17 +225,25 @@ function gaussian2d(sigma, filter_size) return g/sum(g) end -gaussian2d(sigma) = gaussian2d(sigma, []) +gaussian2d(sigma::Number) = gaussian2d(sigma, []) gaussian2d() = gaussian2d(0.5, []) # difference of gaussian -function imdog(sigma) +function imdog(sigma::Number) m = 4*ceil(sqrt(2)*sigma)+1 return gaussian2d(sqrt(2)*sigma, [m m]) - gaussian2d(sigma, [m m]) end imdog() = imdog(0.5) +# laplacian of gaussian +function imlog(sigma::Number) + m = 4*ceil(sigma)+1 + return [((x^2+y^2-sigma^2)/sigma^4)*exp(-(x^2+y^2)/(2*sigma^2)) | x=-floor(m/2):floor(m/2), y=-floor(m/2):floor(m/2)] +end + +imlog() = imlog(0.5) + # Sum of squared differences function ssd{T}(A::Array{T}, B::Array{T}) return sum((A-B).^2) @@ -376,3 +392,106 @@ imgaussiannoise{T}(img::Array{T}) = imgaussiannoise(img, 0.01, 0) # 'illustrates' fourier transform ftshow{T}(A::Array{T,2}) = imshow(log(1+abs(fftshift(A))),[]) +function rgb2ntsc{T}(img::Array{T}) + trans = [0.299 0.587 0.114; 0.596 -0.274 -0.322; 0.211 -0.523 0.312] + out = zeros(T, size(img)) + for i = 1:size(img,1), j = 1:size(img,2) + out[i,j,:] = trans * squeeze(img[i,j,:]) + end + return out +end + +function ntsc2rgb{T}(img::Array{T}) + trans = [1 0.956 0.621; 1 -0.272 -0.647; 1 -1.106 1.703] + out = zeros(T, size(img)) + for i = 1:size(img,1), j = 1:size(img,2) + out[i,j,:] = trans * squeeze(img[i,j,:]) + end + return out +end + +function rgb2ycbcr{T}(img::Array{T}) + trans = [65.481 128.533 24.966; -37.797 -74.203 112; 112 -93.786 -18.214] + offset = [16.0; 128.0; 128.0] + out = zeros(T, size(img)) + for i = 1:size(img,1), j = 1:size(img,2) + out[i,j,:] = offset + trans * squeeze(img[i,j,:]) + end + return out +end + +function ycbcr2rgb{T}(img::Array{T}) + trans = inv([65.481 128.533 24.966; -37.797 -74.203 112; 112 -93.786 -18.214]) + offset = [16.0; 128.0; 128.0] + out = zeros(T, size(img)) + for i = 1:size(img,1), j = 1:size(img,2) + out[i,j,:] = trans * (squeeze(img[i,j,:]) - offset) + end + return out +end + +function imcomplement{T}(img::Array{T}) + return 1 - img +end + +function rgb2hsi{T}(img::Array{T}) + R = img[:,:,1] + G = img[:,:,2] + B = img[:,:,3] + H = acos((1/2*(2*R - G - B)) ./ (((R - G).^2 + (R - B).*(G - B)).^(1/2)+eps(T))) + H[B > G] = 2*pi - H[B > G] + H /= 2*pi + rgb_sum = R + G + B + rgb_sum[rgb_sum == 0] = eps(T) + S = 1 - 3./(rgb_sum).*min(R, G, B) + H[S == 0] = 0 + I = 1/3*(R + G + B) + return cat(3, H, S, I) +end + +function hsi2rgb{T}(img::Array{T}) + H = img[:,:,1]*2*pi + S = img[:,:,2] + I = img[:,:,3] + R = zeros(T, size(img,1), size(img,2)) + G = zeros(T, size(img,1), size(img,2)) + B = zeros(T, size(img,1), size(img,2)) + RG = 0 <= H < 2*pi/3 + GB = 2*pi/3 <= H < 4*pi/3 + BR = 4*pi/3 <= H < 2*pi + # RG sector + B[RG] = I[RG].*(1 - S[RG]) + R[RG] = I[RG].*(1 + (S[RG].*cos(H[RG]))./cos(pi/3 - H[RG])) + G[RG] = 3*I[RG] - R[RG] - B[RG] + # GB sector + R[GB] = I[GB].*(1 - S[GB]) + G[GB] = I[GB].*(1 + (S[GB].*cos(H[GB] - pi/3))./cos(H[GB])) + B[GB] = 3*I[GB] - R[GB] - G[GB] + # BR sector + G[BR] = I[BR].*(1 - S[BR]) + B[BR] = I[BR].*(1 + (S[BR].*cos(H[BR] - 2*pi/3))./cos(-pi/3 - H[BR])) + R[BR] = 3*I[BR] - G[BR] - B[BR] + return cat(3, R, G, B) +end + +function imstretch{T}(img::Array{T,2}, m::Number, slope::Number) + return 1./(1 + (m./(img + eps(T))).^slope) +end + +function imedge{T}(img::Array{T}, method::String, border::String) + # needs more methods + if method == "sobel" + s1, s2 = sobel() + img1 = imfilter(img, s1, border) + img2 = imfilter(img, s2, border) + return img1, img2, sqrt(img1.^2 + img2.^2), atan2(img2, img1) + elseif method == "prewitt" + s1, s2 = prewitt() + img1 = imfilter(img, s1, border) + img2 = imfilter(img, s2, border) + return img1, img2, sqrt(img1.^2 + img2.^2), atan2(img2, img1) + end +end + +imedge{T}(img::Array{T}, method::String) = imedge(img, method, "replicate") +imedge{T}(img::Array{T}) = imedge(img, "sobel", "replicate")