关于matlab中pcolor显示图片时的shading设置问题
在用pcolor進行顯示圖片時,要調(diào)用colormap,caxis,shading進行設(shè)置,才有可能還原圖片本來的色彩
pcolor的用法是:
pcolor(N)其中N是一個矩陣,矩陣的行列數(shù)表示圖片有多少個色塊。忘了說了,pcolor不是用像素來表示圖片大小,而是用色塊來表示。如果N是一個a*b的矩陣,表示這個圖片長寬各位(a-1)*(b-1)個色塊。
a = [1 2 3 45 6 7 89 10 11 12];pcolor(a); shading faceted;colormap在我的上一篇博客中有介紹http://blog.csdn.net/whoispo/article/details/49913513
這里要說明的是:N矩陣的值無論有多大多小,都可以等比例變換到colormap中(1到colormap的行數(shù))。fill中也有類似的功能,imshow沒有這樣的功能,也就是imshow的矩陣的值必須在colormap中。
caxis就表示N中顏色的范圍,用[min,max]表示,對于N中的所有小于等于min的值,都映射到colormap的第一行,N中所有大于等于max的值,都映射到colormap的最后一行。一般我們用默認的值,也就是min是N中最小的值,max是N中最大的值。
最后說一下shading,shading有三種模式:
shading flat
shading faceted
shading interp
flat和faceted只是色塊和色塊直接顯示不顯示黑線的問題,沒有太大區(qū)別。色塊的顏色用的是N中較小索引的顏色,也就是第(i,j)個色塊,用的是N(i,j)的顏色值。色塊內(nèi)部顏色一致,所以N中最后一行和最后一列都沒有用到。
interp是一個插值方法。色塊內(nèi)部顏色不是一致的,第(i,j)個色塊內(nèi)部顏色,用的是第N(i,j), N(i,j+1), N(i+1,j), N(i+1,j+1)的點的顏色進行插值出來的。因此會用到N中的所有數(shù)。
好了理論部分說完了,就說一下使用時會出現(xiàn)的問題吧。
問題1:
問題描述:pcolor顯示圖片一團黑。
問題原因:這是因為matlab默認采用shading faceted。圖片中的黑色,實際上是很多黑線。你放大看一看就明白了。
問題解決方法:
把黑線去掉就行了,有兩種方法
solution1:
[X, map] = imread('corn.tif'); h = pcolor(X); colormap(map); set(h, 'edgecolor', 'none');solution2:
[X, map] = imread('corn.tif'); h = pcolor(X); colormap(map); shading flat;問題2:圖片顯示還是不理想,不是原圖。
問題原因:[X, map] = imread(‘corn.tif’) 返回的map不是pcolor要用到的colormap,而是imshow用的colormap。我上面說了,imshow是不對矩陣做等比例變換的,imshow的矩陣中0對應(yīng)map中的第一行,1對應(yīng)第二行,……
你可以這樣試一試
[X, map] = imread('corn.tif'); imshow(X, map);這樣就很完滿地顯示了圖片。但是這里我想用pcolor顯示圖片,不用imshow。這個問題的根本原因其實就是上面返回的map矩陣,后面許多都是沒用的行,也就是都是0的行。這個問題對于imshow不會出現(xiàn)問題,但是對于pcolor就會出問題。
因此保留map中前面的非零行作為pcolor的colormap,就沒有問題了。
[X, map] = imread('corn.tif'); map = map(1:128,:); pcolor(X); colormap(map); shading flat;看起來長寬有些不對啊,用axis equal可以了
[X, map] = imread('corn.tif'); map = map(1:128,:); pcolor(X); colormap(map); shading flat; axis equal;其實上面的這些我認為都不是什么太大的問題,自己嘗試一下就明白了。下面是我認為比較重要的問題。
我在試上面的例子的時候,用的是shading interp。因為我之前用的colormap都是系統(tǒng)自帶的winter,summer之類的colormap,這些colormap變化是平滑的,所以認為用shading interp會使得圖片顏色更加平滑,放大不會出現(xiàn)鋸齒。結(jié)果:
[X, map] = imread('corn.tif'); map = map(1:128,:); pcolor(X); colormap(map); shading interp; axis equal;我放大之后才想明白這是什么問題:
這個原因就是colormap不是平滑的,所以插值出的顏色也是不平滑的。上面是一個色塊的4個角點,matlab會在中間進行插值,插值的顏色會索引colormap,但是你看一下這個colormap:
[X, map] = imread('corn.tif'); map = map(1:128,:); pcolor(X); colormap(map); shading interp; axis equal;x = [0, 0, 1, 1]; y = [0, 1, 1, 0]; figure; fill(x, y, [0, 0, 2, 2]); colormap(map);我想到了一個方法也許能解決這個問題。把這個colormap進行排序,把它變得平滑一些。因為colormap變化了,所以重新修改圖片矩陣的數(shù)值。這樣也許就能用shading interp了。
我現(xiàn)在還沒有試這個方法,也許以后有時間再試。
其實如果不出問題的話,shading interp真是個好東西。用這個方法顯示出的圖片無論放大多少都不會出現(xiàn)鋸齒模糊,就像矢量圖片一樣。
總結(jié)
以上是生活随笔為你收集整理的关于matlab中pcolor显示图片时的shading设置问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 用步进正弦激励法测量计算机声卡输出输入幅
- 下一篇: windows下批量修改文件(或文件夹)