{"id":704,"date":"2012-11-20T07:00:49","date_gmt":"2012-11-20T12:00:49","guid":{"rendered":"https:\/\/blogs.mathworks.com\/steve\/?p=704"},"modified":"2019-10-31T15:04:13","modified_gmt":"2019-10-31T19:04:13","slug":"image-effects-part-2","status":"publish","type":"post","link":"https:\/\/blogs.mathworks.com\/steve\/2012\/11\/20\/image-effects-part-2\/","title":{"rendered":"Don&#8217;t Photoshop it&#8230;MATLAB it! Image Effects with MATLAB (Part 2)"},"content":{"rendered":"<div class=\"content\"><!--introduction--><p><i>I'd like to welcome back guest blogger <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/authors\/911\">Brett Shoelson<\/a> for the continuation of his series of posts on implementing image special effects in MATLAB. Brett, a contributor for the <a href=\"https:\/\/blogs.mathworks.com\/pick\/\">File Exchange Pick of the Week blog<\/a>, has been doing image processing with MATLAB for almost 20 years now.<\/i><\/p>\r\n\r\n<p>\r\n<a href=\"https:\/\/blogs.mathworks.com\/steve\/2012\/11\/13\/image-effects-part-1\/\">[Part 1]<\/a> \r\n<a href=\"https:\/\/blogs.mathworks.com\/steve\/2012\/11\/20\/image-effects-part-2\/\">[Part 2]<\/a>\r\n<a href=\"https:\/\/blogs.mathworks.com\/steve\/2012\/11\/27\/image-effects-part-3\/\">[Part 3]<\/a>\r\n<a href=\"https:\/\/blogs.mathworks.com\/steve\/2012\/12\/04\/image-effects-part-4\/\">[Part 4]<\/a>\r\n<\/p>\r\n\r\n<!--\/introduction--><h3>Contents<\/h3><div><ul><li><a href=\"#ef4312e3-7f55-47d5-a755-be8102ea0e88\"><tt>imadjust<\/tt> as an Image Enhancement Tool<\/a><\/li><li><a href=\"#92fb1f20-60e8-4faf-958d-9d121a8ceac3\">Andy Warhol Meets an Elephant<\/a><\/li><li><a href=\"#f9808cd5-5c68-43a3-bc35-c30562cf0e2c\">Reading and Pre-Processing the Elephant<\/a><\/li><li><a href=\"#4ba37082-7cf2-4279-94ae-bcbadd63af2d\">Next Up: Put Me In the Zoo!<\/a><\/li><\/ul><\/div><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/pick\/files\/fluorescentzebra.png\" alt=\"\"> <\/p><h4><tt>imadjust<\/tt> as an Image Enhancement Tool<a name=\"ef4312e3-7f55-47d5-a755-be8102ea0e88\"><\/a><\/h4><p>In my <a href=\"https:\/\/blogs.mathworks.com\/steve\/?p=701\">previous post<\/a> in this guest series, I introduced my <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/955-imageadjuster\">image adjustment GUI<\/a>, and used it to enhance colors in modified versions of images of a mandrill and of two zebras. For both of those images, I operated on all colorplanes uniformly; i.e., whatever I did to the red plane, I also did to green and blue. The calling syntax for <tt>imadjust<\/tt> is as follows:<\/p><pre>imgOut = imadjust(imgIn,[low_in; high_in],[low_out; high_out],gamma);<\/pre><p>The default inputs are:<\/p><pre>imgOut = imadjust(imgIn,[0; 1],[0; 1],1);<\/pre><p>Different input parameters will produce different effects. In fact, <tt>imadjust<\/tt> should often be the starting point for simply correcting illumination issues with an image:<\/p><pre class=\"language-matlab\">URL = <span class=\"string\">'https:\/\/blogs.mathworks.com\/pick\/files\/DrinkingZebra1.jpg'<\/span>;\r\nimg = imrotate(imread(URL),-90);\r\nenhanced = imadjust(img,[0.00; 0.35],[0.00; 1.00], 1.00);\r\nsubplot(1,2,1);imshow(img);title(<span class=\"string\">'Original'<\/span>);\r\nsubplot(1,2,2);imshow(enhanced);title(<span class=\"string\">'|imadjust|-Enhanced'<\/span>);\r\n<\/pre><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/pick\/files\/imadjustDemo.png\" alt=\"\"> <\/p><p>You may recall that when I modified the image of two zebras in my previous post, I not only increased low_out, but I also reversed (and tweaked) the values for low_out and high_out:<\/p><pre>imgEnhanced = imadjust(imgEnhanced,[0.30; 0.85],[0.90; 0.00], 0.90);<\/pre><p>In reversing those input values, I effectively <i>reversed the image<\/i>. In fact, for a grayscale image, calling<\/p><pre class=\"language-matlab\">imgOut = imadjust(imgIn,[0; 1],[1; 0],1); <span class=\"comment\">% Note the reversal of low_out and high_out<\/span>\r\n<\/pre><p>is equivalent to calling <tt>imgOut = imcomplement(imgIn)<\/tt>:<\/p><pre class=\"language-matlab\">img = imread(<span class=\"string\">'cameraman.tif'<\/span>);\r\nimg1 = imadjust(img,[0.00; 1.00],[1.00; 0.00], 1.00);\r\nimg2 = imcomplement(img);\r\nassert(isequal(img1,img2))<span class=\"comment\">% No error is thrown!<\/span>\r\nfigure;subplot(1,2,1);imshow(img);xlabel(<span class=\"string\">'Original image courtesy MIT'<\/span>);\r\nsubplot(1,2,2);imshow(img1);\r\n<\/pre><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/pick\/files\/cameramanReversed1.png\" alt=\"\"> <\/p><p>Now recognize that ImadjustGUI calls <tt>imadjust<\/tt> behind the scenes, using the standard syntax. If you read the documentation for <tt>imadjust<\/tt> carefully, you will learn that the parameter inputs low_in, high_in, low_out, high_out, and gamma need not be scalars. In fact, if those parameters are specifed appropriately as 1-by-3 vectors, then <tt>imadjust<\/tt> operates <i>separately<\/i> on the red, green, and blue colorplanes:<\/p><pre>newmap = imadjust(map,[low_in; high_in],[low_out; high_out],gamma)<\/pre><pre class=\"language-matlab\"><span class=\"comment\">% ...transforms the colormap associated with an indexed image.<\/span>\r\n<span class=\"comment\">% If low_in, high_in, low_out, high_out, and gamma are scalars, then the<\/span>\r\n<span class=\"comment\">% same mapping applies to red, green, and blue components.<\/span>\r\n<span class=\"comment\">%<\/span>\r\n<span class=\"comment\">% Unique mappings for each color component are possible when low_in and<\/span>\r\n<span class=\"comment\">% high_in are both 1-by-3 vectors, low_out and high_out are both 1-by-3 vectors,<\/span>\r\n<span class=\"comment\">% or gamma is a 1-by-3 vector.<\/span>\r\n<\/pre><p>That works for adjusting colormaps; it also works for adjusting images. As a result, <i>you can readily reverse individual colorplanes<\/i> of an input RGB image, and in doing, create some cool effects!<\/p><h4>Andy Warhol Meets an Elephant<a name=\"92fb1f20-60e8-4faf-958d-9d121a8ceac3\"><\/a><\/h4><p>Andy Warhol famously created iconic images of Marilyn Monroe and other celebrities, casting them in startling, unexpected colors, and sometimes tiling them to create memorable effects. We can easily produce similar effects by <i>reversing and saturating<\/i> individual colorplanes of RGB images. (I wrote <tt>ImadjustGUI<\/tt> to facilitate, interactively, those plane-by-plane intensity adjustments.)<\/p><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/pick\/files\/WarholElephants.png\" alt=\"\"> <\/p><h4>Reading and Pre-Processing the Elephant<a name=\"f9808cd5-5c68-43a3-bc35-c30562cf0e2c\"><\/a><\/h4><p>First, of course, we read and display the elephant:<\/p><pre>URL = 'https:\/\/blogs.mathworks.com\/pick\/files\/ElephantProfile.jpg';\r\nimg = imread(URL);<\/pre><p>He's a wrinkly old fellow (below left). I'd like to bring out those wrinkles by enhancing contrast in the image. There are a few ways to do that, but I learned about my favorite way by reading through the \"Gray-Scale Morphology\" section of <a href=\"http:\/\/imageprocessingplace.com\/DIPUM-2E\/dipum2e_main_page.htm\">DIPUM, 2nd Ed.<\/a> Specifically, the authors of this (most excellent) book indicated (on page 529) that one could combine topat and bottomhat filters to enhance contrast. (I built the appropriate combination of those filters behind the \"Contrast Enhancement\" button of <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/23697-image-morphology\">MorphTool<\/a>.) So, using MorphTool-generated code:<\/p><pre class=\"language-matlab\">SE = strel(<span class=\"string\">'Disk'<\/span>,18);\r\nimgEnhanced = imsubtract(imadd(img,imtophat(img,SE)),imbothat(img,SE));\r\n<\/pre><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/pick\/files\/ElephantContrast.png\" alt=\"\"> <\/p><p>Now, operating with <tt>imadjust<\/tt> plane by plane, reversing the red and blue planes, and modifying the gamma mapping, I can easily find my way to several interesting effects. For instance:<\/p><pre class=\"language-matlab\">imgEnhanced1 = imadjust(imgEnhanced,[0.00 0.00 0.00; 1.00 0.38 0.40],[1.00 0.00 0.70; 0.20 1.00 0.40], [4.90 4.00 1.70]);\r\nimgEnhanced2 = imadjust(imgEnhanced,[0.13 0.00 0.30; 0.75 1.00 1.00],[0.00 1.00 0.50; 1.00 0.00 0.27], [5.90 0.80 4.10]);\r\n<\/pre><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/pick\/files\/SaturatedElephants.png\" alt=\"\"> <\/p><p>So, two more of those interesting effects, and then we can compose the four-elephants image above:<\/p><pre>imgEnhanced3 = imadjust(img,[0.20 0.00 0.09; 0.83 1.00 0.52],[0.00 0.00 1.00; 1.00 1.00 0.00], [1.10 2.70 1.00]);\r\nimgEnhanced4 = imadjust(img,[0.20 0.00 0.00; 0.70 1.00 1.00],[1.00 0.90 0.00; 0.00 0.90 1.00], [1.30 1.00 1.00]);<\/pre><p>I also wanted to flip two of those enhanced images. <tt>fliplr<\/tt> makes it easy to flip a 2-dimensional matrix, but it doesn't work on RGB images. So I flipped them plane-by-plane, and concatenated <a href=\"https:\/\/www.mathworks.com\/help\/releases\/R2012b\/matlab\/ref\/cat.html\"><tt>cat<\/tt><\/a> the flipped planes in the third ( <i>z<\/i> -) dimensioninto new RGB images:<\/p><pre>r = fliplr(imgEnhanced2(:,:,1));\r\ng = fliplr(imgEnhanced2(:,:,2));\r\nb = fliplr(imgEnhanced2(:,:,3));\r\nimgEnhanced2 = cat(3,r,g,b);<\/pre><pre class=\"language-matlab\">CompositeImage = [imgEnhanced1 imgEnhanced2; imgEnhanced3 imgEnhanced4]; <span class=\"comment\">% (Images 2 and 4 are flipped plane-by-plane.)<\/span>\r\n<\/pre><h4>Next Up: Put Me In the Zoo!<a name=\"4ba37082-7cf2-4279-94ae-bcbadd63af2d\"><\/a><\/h4><p><img decoding=\"async\" vspace=\"5\" hspace=\"5\" src=\"https:\/\/blogs.mathworks.com\/pick\/files\/GiraffeSpots.png\" alt=\"\"> <\/p><p>All images except \"cameraman\" copyright Brett Shoelson; used with permission.<\/p><script language=\"JavaScript\"> <!-- \r\n    function grabCode_e115424224484585946fb74b7f3025ec() {\r\n        \/\/ Remember the title so we can use it in the new page\r\n        title = document.title;\r\n\r\n        \/\/ Break up these strings so that their presence\r\n        \/\/ in the Javascript doesn't mess up the search for\r\n        \/\/ the MATLAB code.\r\n        t1='e115424224484585946fb74b7f3025ec ' + '##### ' + 'SOURCE BEGIN' + ' #####';\r\n        t2='##### ' + 'SOURCE END' + ' #####' + ' e115424224484585946fb74b7f3025ec';\r\n    \r\n        b=document.getElementsByTagName('body')[0];\r\n        i1=b.innerHTML.indexOf(t1)+t1.length;\r\n        i2=b.innerHTML.indexOf(t2);\r\n \r\n        code_string = b.innerHTML.substring(i1, i2);\r\n        code_string = code_string.replace(\/REPLACE_WITH_DASH_DASH\/g,'--');\r\n\r\n        \/\/ Use \/x3C\/g instead of the less-than character to avoid errors \r\n        \/\/ in the XML parser.\r\n        \/\/ Use '\\x26#60;' instead of '<' so that the XML parser\r\n        \/\/ doesn't go ahead and substitute the less-than character. \r\n        code_string = code_string.replace(\/\\x3C\/g, '\\x26#60;');\r\n\r\n        copyright = 'Copyright 2012 The MathWorks, Inc.';\r\n\r\n        w = window.open();\r\n        d = w.document;\r\n        d.write('<pre>\\n');\r\n        d.write(code_string);\r\n\r\n        \/\/ Add copyright line at the bottom if specified.\r\n        if (copyright.length > 0) {\r\n            d.writeln('');\r\n            d.writeln('%%');\r\n            if (copyright.length > 0) {\r\n                d.writeln('% _' + copyright + '_');\r\n            }\r\n        }\r\n\r\n        d.write('<\/pre>\\n');\r\n\r\n        d.title = title + ' (MATLAB code)';\r\n        d.close();\r\n    }   \r\n     --> <\/script><p style=\"text-align: right; font-size: xx-small; font-weight:lighter;   font-style: italic; color: gray\"><br><a href=\"javascript:grabCode_e115424224484585946fb74b7f3025ec()\"><span style=\"font-size: x-small;        font-style: italic;\">Get \r\n      the MATLAB code <noscript>(requires JavaScript)<\/noscript><\/span><\/a><br><br>\r\n      Published with MATLAB&reg; R2012b<br><\/p><p class=\"footer\"><br>\r\n      Published with MATLAB&reg; R2012b<br><\/p><\/div><!--\r\ne115424224484585946fb74b7f3025ec ##### SOURCE BEGIN #####\r\n%% Don't Photoshop it...MATLAB it! Image Effects with MATLAB (Part 2)\r\n%\r\n% _I'd like to welcome back guest blogger\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/authors\/911 Brett\r\n% Shoelson> for the continuation of his series of posts on implementing\r\n% image special effects in MATLAB. Brett, a contributor for the\r\n% <https:\/\/blogs.mathworks.com\/pick\/ File Exchange Pick of the Week blog>,\r\n% has been doing image processing with MATLAB for almost 20 years now._\r\n%%\r\n% \r\n% <<https:\/\/blogs.mathworks.com\/pick\/files\/fluorescentzebra.png>>\r\n% \r\n%% |imadjust| as an Image Enhancement Tool\r\n% In my <https:\/\/blogs.mathworks.com\/steve\/?p=701 previous post> in this\r\n% guest series, I introduced my\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/955-imageadjuster\r\n% image adjustment GUI>, and used it to enhance colors in modified versions\r\n% of images of a mandrill and of two zebras. For both of those images, I\r\n% operated on all colorplanes uniformly; i.e., whatever I did to the red\r\n% plane, I also did to green and blue. The calling syntax for |imadjust| is\r\n% as follows:\r\n%\r\n%  imgOut = imadjust(imgIn,[low_in; high_in],[low_out; high_out],gamma);\r\n%\r\n% The default inputs are:\r\n%\r\n%  imgOut = imadjust(imgIn,[0; 1],[0; 1],1);\r\n%\r\n% Different input parameters will produce different effects. In fact,\r\n% |imadjust| should often be the starting point for simply correcting\r\n% illumination issues with an image:\r\n%\r\n%   URL = 'https:\/\/blogs.mathworks.com\/pick\/files\/DrinkingZebra1.jpg';\r\n%   img = imrotate(imread(URL),-90);\r\n%   enhanced = imadjust(img,[0.00; 0.35],[0.00; 1.00], 1.00);\r\n%   subplot(1,2,1);imshow(img);title('Original');\r\n%   subplot(1,2,2);imshow(enhanced);title('|imadjust|-Enhanced');\r\n\r\n%%\r\n% \r\n% <<https:\/\/blogs.mathworks.com\/pick\/files\/imadjustDemo.png>>\r\n% \r\n\r\n%%\r\n% You may recall that when I modified the image of two zebras in my previous post, I not only\r\n% increased low_out, but I also reversed (and tweaked) the values for\r\n% low_out and high_out:\r\n%\r\n%  imgEnhanced = imadjust(imgEnhanced,[0.30; 0.85],[0.90; 0.00], 0.90);\r\n% \r\n% In reversing those input values, I effectively _reversed the image_. In\r\n% fact, for a grayscale image, calling\r\n%\r\n%   imgOut = imadjust(imgIn,[0; 1],[1; 0],1); % Note the reversal of low_out and high_out\r\n%\r\n% is equivalent to calling |imgOut = imcomplement(imgIn)|:\r\n%\r\n%   img = imread('cameraman.tif');\r\n%   img1 = imadjust(img,[0.00; 1.00],[1.00; 0.00], 1.00);\r\n%   img2 = imcomplement(img);\r\n%   assert(isequal(img1,img2))% No error is thrown!\r\n%   figure;subplot(1,2,1);imshow(img);xlabel('Original image courtesy MIT');\r\n%   subplot(1,2,2);imshow(img1);\r\n%%\r\n% \r\n% <<https:\/\/blogs.mathworks.com\/pick\/files\/cameramanReversed1.png>>\r\n% \r\n\r\n%%\r\n% Now recognize that ImadjustGUI calls |imadjust| behind the scenes, using\r\n% the standard syntax. If you read the documentation for |imadjust|\r\n% carefully, you will learn that the parameter inputs low_in, high_in,\r\n% low_out, high_out, and gamma need not be scalars. In fact, if those\r\n% parameters are specifed appropriately as 1-by-3 vectors, then |imadjust|\r\n% operates _separately_ on the red, green, and blue colorplanes:\r\n%\r\n%%\r\n%  newmap = imadjust(map,[low_in; high_in],[low_out; high_out],gamma)\r\n%\r\n%   % ...transforms the colormap associated with an indexed image.\r\n%   % If low_in, high_in, low_out, high_out, and gamma are scalars, then the\r\n%   % same mapping applies to red, green, and blue components.\r\n%   %\r\n%   % Unique mappings for each color component are possible when low_in and\r\n%   % high_in are both 1-by-3 vectors, low_out and high_out are both 1-by-3 vectors, \r\n%   % or gamma is a 1-by-3 vector. \r\n%\r\n% That works for adjusting colormaps; it also works for adjusting images.\r\n% As a result, _you can readily reverse individual colorplanes_ of an input\r\n% RGB image, and in doing, create some cool effects!\r\n\r\n%% Andy Warhol Meets an Elephant\r\n% Andy Warhol famously created iconic images of Marilyn Monroe and other\r\n% celebrities, casting them in startling, unexpected colors, and sometimes\r\n% tiling them to create memorable effects. We can easily produce similar\r\n% effects by _reversing and saturating_ individual colorplanes of RGB\r\n% images. (I wrote |ImadjustGUI| to facilitate, interactively, those\r\n% plane-by-plane intensity adjustments.)\r\n\r\n%% \r\n% \r\n% <<https:\/\/blogs.mathworks.com\/pick\/files\/WarholElephants.png>>\r\n% \r\n\r\n%% Reading and Pre-Processing the Elephant\r\n% First, of course, we read and display the elephant:\r\n%\r\n%  URL = 'https:\/\/blogs.mathworks.com\/pick\/files\/ElephantProfile.jpg';\r\n%  img = imread(URL);\r\n%\r\n%% \r\n% He's a wrinkly old fellow (below left). I'd like to bring out those wrinkles by\r\n% enhancing contrast in the image. There are a few ways to do that, but I\r\n% learned about my favorite way by reading through\r\n% the \"Gray-Scale Morphology\" section of \r\n% <http:\/\/imageprocessingplace.com\/DIPUM-2E\/dipum2e_main_page.htm DIPUM, 2nd Ed.>\r\n% Specifically, the authors of this (most excellent) book indicated (on page 529) that\r\n% one could combine topat and bottomhat filters to enhance contrast. (I\r\n% built the appropriate combination of those filters behind the \"Contrast Enhancement\" \r\n% button of\r\n% <https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/23697-image-morphology MorphTool>.)\r\n% So, using MorphTool-generated code:\r\n%\r\n%   SE = strel('Disk',18);\r\n%   imgEnhanced = imsubtract(imadd(img,imtophat(img,SE)),imbothat(img,SE));\r\n%\r\n%%\r\n% \r\n% <<https:\/\/blogs.mathworks.com\/pick\/files\/ElephantContrast.png>>\r\n% \r\n\r\n%%\r\n% Now, operating with |imadjust| plane by plane, reversing the red and blue\r\n% planes, and modifying the gamma mapping, I can easily find my way to \r\n% several interesting effects. For instance:\r\n% \r\n%   imgEnhanced1 = imadjust(imgEnhanced,[0.00 0.00 0.00; 1.00 0.38 0.40],[1.00 0.00 0.70; 0.20 1.00 0.40], [4.90 4.00 1.70]);\r\n%   imgEnhanced2 = imadjust(imgEnhanced,[0.13 0.00 0.30; 0.75 1.00 1.00],[0.00 1.00 0.50; 1.00 0.00 0.27], [5.90 0.80 4.10]);\r\n%\r\n%%\r\n% \r\n% <<https:\/\/blogs.mathworks.com\/pick\/files\/SaturatedElephants.png>>\r\n% \r\n\r\n%%\r\n% So, two more of those interesting effects, and then we can compose the\r\n% four-elephants image above:\r\n%\r\n%  imgEnhanced3 = imadjust(img,[0.20 0.00 0.09; 0.83 1.00 0.52],[0.00 0.00 1.00; 1.00 1.00 0.00], [1.10 2.70 1.00]);\r\n%  imgEnhanced4 = imadjust(img,[0.20 0.00 0.00; 0.70 1.00 1.00],[1.00 0.90 0.00; 0.00 0.90 1.00], [1.30 1.00 1.00]);\r\n\r\n%%\r\n% I also wanted to flip two of those enhanced images. |fliplr| makes it\r\n% easy to flip a 2-dimensional matrix, but it doesn't work on RGB\r\n% images. So I flipped them plane-by-plane, and concatenated\r\n% <https:\/\/www.mathworks.com\/help\/releases\/R2012b\/matlab\/ref\/cat.html |cat|> \r\n% the flipped planes in the third ( _z_ -) dimensioninto new RGB images:\r\n%\r\n%  r = fliplr(imgEnhanced2(:,:,1));\r\n%  g = fliplr(imgEnhanced2(:,:,2));\r\n%  b = fliplr(imgEnhanced2(:,:,3));\r\n%  imgEnhanced2 = cat(3,r,g,b);\r\n% \r\n%   CompositeImage = [imgEnhanced1 imgEnhanced2; imgEnhanced3 imgEnhanced4]; % (Images 2 and 4 are flipped plane-by-plane.)\r\n \r\n%% Next Up: Put Me In the Zoo!\r\n%%\r\n% \r\n% <<https:\/\/blogs.mathworks.com\/pick\/files\/GiraffeSpots.png>>\r\n% \r\n%%\r\n% All images except \"cameraman\" copyright Brett Shoelson; used with permission.\r\n\r\n##### SOURCE END ##### e115424224484585946fb74b7f3025ec\r\n-->","protected":false},"excerpt":{"rendered":"<!--introduction--><p><i>I'd like to welcome back guest blogger <a href=\"https:\/\/www.mathworks.com\/matlabcentral\/fileexchange\/authors\/911\">Brett Shoelson<\/a> for the continuation of his series of posts on implementing image special effects in MATLAB. Brett, a contributor for the <a href=\"https:\/\/blogs.mathworks.com\/pick\/\">File Exchange Pick of the Week blog<\/a>, has been doing image processing with MATLAB for almost 20 years now.<\/i>... <a class=\"read-more\" href=\"https:\/\/blogs.mathworks.com\/steve\/2012\/11\/20\/image-effects-part-2\/\">read more >><\/a><\/p>","protected":false},"author":42,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":[],"categories":[22],"tags":[615,725,192,953,949,955,146,76,945,36,951,514,346,106,72,52,94],"_links":{"self":[{"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/posts\/704"}],"collection":[{"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/users\/42"}],"replies":[{"embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/comments?post=704"}],"version-history":[{"count":6,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/posts\/704\/revisions"}],"predecessor-version":[{"id":3803,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/posts\/704\/revisions\/3803"}],"wp:attachment":[{"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/media?parent=704"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/categories?post=704"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blogs.mathworks.com\/steve\/wp-json\/wp\/v2\/tags?post=704"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}