python数字图像处理(5):图像的绘制

版权声明:本文为博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/denny2015/article/details/50532961

实际上前面我们就已经用到了图像的绘制,如:

io.imshow(img)  

这一行代码就是得利用matplotlib包对图片进行绘制,绘制成功后,返回一个matplotlib类型的数据。要显示绘制的图片,我们可以调用show()函数来进行显示,但进行练习的时候,一般我们可以省略show()函数,也能自动显示出来。

from skimage import io,data
img=data.astronaut()
dst=io.imshow(img)
print(type(dst))
io.show()

显示为:

可以看到,类型是'matplotlib.image.AxesImage',它除了图像本身信息,还有坐标尺等其它信息。如果要同时显示两张图片,那么在显示第二张图片的时候,会把第一张图片覆盖掉。

matplotlib是一个专业绘图的库,相当于matlab中的plot,可以设置多个figure,设置figure的标题,隐藏坐标尺,甚至可以使用subplot在一个figure中显示多张图片。一般我们可以这样导入matplotlib库:

import matplotlib.pyplot as plt

也就是说,我们绘图实际上用的是matplotlib包的pyplot模块。

例:分开并同时显示宇航员图片的三个通道

from skimage import data
import matplotlib.pyplot as plt
img=data.astronaut()
plt.figure(num='astronaut',figsize=(8,8))  #创建一个名为astronaut的窗口,并设置大小 

plt.subplot(2,2,1)     #将窗口分为两行两列四个子窗口,则可显示四幅图片
plt.title('origin image')   #第一幅图片标题
plt.imshow(img)      #绘制第一幅图片

plt.subplot(2,2,2)     #第二个子窗口
plt.title('R channel')   #第二幅图片标题
plt.imshow(img[:,:,0],plt.cm.gray)      #绘制第二幅图片,且为灰度图
plt.axis('off')     #不显示坐标尺寸

plt.subplot(2,2,3)     #第三个子窗口
plt.title('G channel')   #第三幅图片标题
plt.imshow(img[:,:,1],plt.cm.gray)      #绘制第三幅图片,且为灰度图
plt.axis('off')     #不显示坐标尺寸

plt.subplot(2,2,4)     #第四个子窗口
plt.title('B channel')   #第四幅图片标题
plt.imshow(img[:,:,2],plt.cm.gray)      #绘制第四幅图片,且为灰度图
plt.axis('off')     #不显示坐标尺寸

plt.show()   #显示窗口

另外一种编写方法也可以:

import matplotlib.pyplot as plt
from skimage import data,color

img = data.immunohistochemistry()
hsv = color.rgb2hsv(img)

fig, axes = plt.subplots(2, 2, figsize=(7, 6))
ax0, ax1, ax2, ax3 = axes.ravel()

ax0.imshow(img)
ax0.set_title("Original image")

ax1.imshow(hsv[:, :, 0], cmap=plt.cm.gray)
ax1.set_title("H")

ax2.imshow(hsv[:, :, 1], cmap=plt.cm.gray)
ax2.set_title("S")

ax3.imshow(hsv[:, :, 2], cmap=plt.cm.gray)
ax3.set_title("V")

for ax in axes.ravel():
    ax.axis('off')

fig.tight_layout()  #自动调整subplot间的参数

两种书写方法效果是一样的,你喜欢哪种就用哪种!!

除了使用matplotlib库来绘制图片,skimage还有另一个模块ImageViewer,也可以显示图片。

它是利用Qt工具来创建一块画布,从而在画布上绘制图像。

例:

from skimage import data
from skimage.viewer import ImageViewer

img = data.coins()
viewer = ImageViewer(img)
viewer.show()

 

展开阅读全文

c# 数字图像处理直方图绘制

12-04

照着赵春江那本书写的代码~ 代码和下面从网上copy来的一致~但是我的显示为什么是这样的哇?恳请各位高手解决~rn[img=http://img.my.csdn.net/uploads/201212/04/1354607521_8108.jpg][/img]rnrn双击“histogram”控件,并在其中添加如下代码:rn private void histogram_Click(object sender, EventArgs e)rn rn if (curBitmap != null)rn rn //定义并实例化新窗体,并把图像数据传递给它;rn histForm histoGram = new histForm(curBitmap);rn //打开从窗体;rn histoGram.ShowDialog();rn rn elsern rn //没有打开图像时,弹出对应的提示框;rn MessageBox.Show("请先打开图像!");rn rn rn rn然后在打开的histForm窗体中先定义以下3个数据成员:rn //图像数据rn private System.Drawing.Bitmap bmpHist;rn //为了标识横纵坐标的标识;rn private int[] countPixel;rn rn private int maxPixel=1000;//记录最大的灰度级个数rn为了实现两个窗体之间的数据传递,需要改写histForm窗体的构造函数,其代码如下:rn public histForm(Bitmap bmp)rn rn InitializeComponent();rn //把主窗体的图像数据传递给从窗体rn bmpHist = bmp;rn //灰度级计数rn countPixel=new int[256];rn rn rn分别为histForm窗体添加Paint和Load事件,Paint事件用于绘制直方图,Load事件用于计算各个灰度级所具有的像素个数,其代码如下:rn rn1——————————————————————Paint事件;rn private void histForm_Paint(object sender, PaintEventArgs e)rn rn //获取Graphics对象rn Graphics g = e.Graphics;rnrn //创建一个宽度为1的黑色钢笔rn Pen curPen = new Pen(Brushes.Black, 1);rn //绘制坐标轴rn //(y,x)=(50,240)原点;rn g.DrawLine(curPen,50,240,320,240);//横坐标rn g.DrawLine(curPen,50,240,50,30);//纵坐标rn //绘制并标识坐标刻度rn g.DrawLine(curPen, 100, 240, 100, 242);rn g.DrawLine(curPen, 150, 240, 150, 242);rn g.DrawLine(curPen, 200, 240, 200, 242);rn g.DrawLine(curPen, 250, 240, 250, 242);rn g.DrawLine(curPen, 300, 240, 300, 242);rn g.DrawString("0", new Font("New Timer", 8), Brushes.Black, new PointF(46, 242));rn g.DrawString("50", new Font("New Timer", 8), Brushes.Black, new PointF(92, 242));rn g.DrawString("100", new Font("New Timer", 8), Brushes.Black, new PointF(139, 242));rn g.DrawString("150", new Font("New Timer", 8), Brushes.Black, new PointF(189, 242));rn g.DrawString("200", new Font("New Timer", 8), Brushes.Black, new PointF(239, 242));rn g.DrawString("250", new Font("New Timer", 8), Brushes.Black, new PointF(289, 242));rn g.DrawLine(curPen,48,40,50,40);rn g.DrawString(maxPixel.ToString(), new Font("New Timer", 8), Brushes.Black, new PointF(18, 38));rn //开始绘制直方图rn double temp = 0;rn for (int i = 0; i < 256;i++ )rn rn //计算出纵坐标的长度rn temp = 200.0 * countPixel[i] / maxPixel;rn g.DrawLine(curPen,50+i,240,50+i,240-(int)temp);rn rn //释放对象rn curPen.Dispose();rn rn2————————————————Load事件:rnrn /// rn /// 直方图的绘制;rn /// rn /// rn /// rn private void histForm_Load(object sender, EventArgs e)rn rn //锁定8位灰度位图rn Rectangle rect = new Rectangle(0, 0, bmpHist.Width, bmpHist.Height);rn System.Drawing.Imaging.BitmapData bmpData = bmpHist.LockBits(rect,rn System.Drawing.Imaging.ImageLockMode.ReadOnly,rn bmpHist.PixelFormat);rn IntPtr ptr = bmpData.Scan0;rn int bytes = bmpHist.Width * bmpHist.Height*3;rn byte[] graybValues = new byte[bytes];rn System.Runtime.InteropServices.Marshal.Copy(ptr, graybValues, 0, bytes);rn byte temp = 0;rn maxPixel = 0;rn //灰度等级数组清零rn Array.Clear(countPixel,0,256);rn //计算各个灰度级的像素个数rn for (int i = 0; i < bytes;i++ )rn rn //灰度级rn temp=graybValues[i];rn //计数加1rn countPixel[temp]++;rn if(countPixel[temp]>maxPixel)rn rn //找到灰度频率最大的像素数,用于绘制直方图rn maxPixel=countPixel[temp];rn rn rn //解锁rn System.Runtime.InteropServices.Marshal.Copy(graybValues,0,ptr,bytes);rn bmpHist.UnlockBits(bmpData);rn 论坛

没有更多推荐了,返回首页