当前位置:   article > 正文

数字图像处理之(4)---图像处理以及融合logo(大作业实验)(OPENCV-python)_数字图像处理大作业

数字图像处理大作业

 系列文章目录

 数字图像处理:大约()章。

0.大作业理论部分                                :大作业理论部分

1.窗口,图像导入导出                        :所属文章链接(1)---准备工作

 2.颜色,色域转换,控制条                :所属文章链接(2)---颜色色域转换

3.图像运算处理                                   :所属文章链接(3)---图像基本处理操作

4.图像处理以及融合logo(大作业实验)   :本文章

5.标题        :(链接)

6.QT+OPENCV:基于QT的图像缩放功能

 7...............

当前文章目录

一.理论部分

...........

二.实际操作

      (1)图像添加透明LOGO

代码和现象

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. import os
  5. #os.chdir('C:/Users/lenovo/Pictures/')
  6. # 1. 读取图片
  7. img1 = cv2.imread("./pic/moon.jpg") #读取沙漠图片
  8. img2 = cv2.imread("./pic/logo2.jpg") #读取logo图片
  9. #img2 = cv2.imread('opencv_logo.jpg',0) #也可以读取logo的时候直接灰度化
  10. # 2. 根据logo大小提取感兴趣区域roi
  11. # 把logo放在左上角,提取原图中要放置logo的区域roi
  12. rows, cols = img2.shape[:2]
  13. roi = img1[:rows, :cols]
  14. # 3. 创建掩膜mask
  15. img2gray = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY) #将图片灰度化,如果在读取logo时直接灰度化,该步骤可省略
  16. #cv2.THRESH_BINARY:如果一个像素值低于200,则像素值转换为255(白色色素值),否则转换成0(黑色色素值)
  17. #即有内容的地方为黑色0,无内容的地方为白色255.
  18. #白色的地方还是白色,除了白色的地方全变成黑色
  19. ret, mask = cv2.threshold(img2gray, 175, 255, cv2.THRESH_BINARY)#阙值操作
  20. mask_inv = cv2.bitwise_not(mask) #与mask颜色相反,白色变成黑色,黑变白
  21. # 4. logo与感兴趣区域roi融合
  22. # 保留除logo外的背景
  23. img1_bg = cv2.bitwise_and(roi, roi, mask=mask)
  24. img2_fg = cv2.bitwise_and(img2,img2,mask=mask_inv)
  25. dst = cv2.add(img1_bg, img2_fg) # logo与感兴趣区域roi进行融合
  26. img1[:rows, :cols] = dst # 将融合后的区域放进原图
  27. img_new_add = img1.copy() #对处理后的图像进行拷贝
  28. # 5. 显示每步处理后的图片
  29. '''
  30. # 显示图片,调用opencv展示
  31. cv2.imshow('logo',img2)
  32. cv2.imshow('logo_gray',img2gray)
  33. cv2.imshow('logo_mask',mask)
  34. cv2.imshow('logo_mask_inv',mask_inv)
  35. cv2.imshow('roi',roi)
  36. cv2.imshow('img1_bg',img1_bg)
  37. cv2.imshow('img2_fg',img2_fg)
  38. cv2.imshow('dst',dst)
  39. cv2.waitKey(0)
  40. cv2.destroyAllWindows()
  41. '''
  42. # cv2与matplotlib的图像颜色模式转换,cv2是BGR格式,matplotlib是RGB格式
  43. def img_convert(cv2_img):
  44. # 灰度图片直接返回
  45. if len(cv2_img.shape) == 2:
  46. return cv2_img
  47. # 3通道的BGR图片
  48. elif len(cv2_img.shape) == 3 and cv2_img.shape[2] == 3:
  49. b, g, r = cv2.split(cv2_img) #分离原图像通道
  50. return cv2.merge((r, g, b)) #合并新的图像通道
  51. # 4通道的BGR图片
  52. elif len(cv2_img.shape) == 3 and cv2_img.shape[2] == 4:
  53. b, g, r, a = cv2.split(cv2_img)
  54. return cv2.merge((r, g, b, a))
  55. # 未知图片格式
  56. else:
  57. return cv2_img
  58. # 显示图片,调用matplotlib展示
  59. titles = ['logo','logo_gray','logo_mask','logo_mask_inv','roi','img1_bg','img2_fg','dst']
  60. imgs = [img2,img2gray,mask,mask_inv,roi,img1_bg,img2_fg,dst]
  61. for i in range(len(imgs)):
  62. plt.subplot(2,4,i+1),plt.imshow(img_convert(imgs[i]),'gray')
  63. plt.title(titles[i])
  64. plt.xticks([]),plt.yticks([])
  65. plt.show()
  66. # 显示并保存加logo的图片
  67. cv2.imshow('img_new_add',img_new_add)
  68. cv2.imwrite('img_new_add.jpg',img_new_add)
  69. cv2.waitKey(0)
  70. cv2.destroyAllWindows()

 

 

        (2)大作业

  1. import cv2
  2. import numpy as np
  3. import matplotlib.pyplot as plt
  4. imgcat = cv2.imread("./pic/moon.jpg")
  5. imglogo = cv2.imread("./pic/sspu55.png")
  6. moon_cut = cv2.imread("./pic/moon_cut.png")
  7. width,height = imglogo.shape[0:2]
  8. #cv2.imshow('原图', imgcat)
  9. #胡椒噪音,中值滤波
  10. imgcat = cv2.medianBlur(imgcat, 5)
  11. moon_cut = cv2.medianBlur(moon_cut, 5)
  12. #cv2.imshow('lvbo', imgcat)
  13. #灰度图
  14. imglogotr = cv2.cvtColor(imglogo,cv2.COLOR_BGR2GRAY)
  15. imgcattr1 = cv2.cvtColor(imgcat,cv2.COLOR_BGR2GRAY)
  16. moon_g = cv2.cvtColor(moon_cut,cv2.COLOR_BGR2GRAY)
  17. #cv2.imshow('imglogotr',imglogotr)
  18. #cv2.imshow('imgcattr1',imgcattr1)
  19. #二值化(返回值,阈值和图)
  20. ret,imglogoms = cv2.threshold(imglogotr,96,255,cv2.THRESH_BINARY_INV)
  21. ret,imgcatms = cv2.threshold(imgcattr1,96,200,cv2.THRESH_BINARY_INV)
  22. ret,moon_b= cv2.threshold(moon_g,96,200,cv2.THRESH_BINARY_INV)
  23. #cv2.imshow('moon',moon_b)
  24. #cv2.imshow('imglogoms',imglogoms)
  25. #cv2.imshow('imgcatms',imgcatms)
  26. #cv2.imshow('two',imgcatms)
  27. imglogotr = cv2.add(imglogo,imglogo,mask=imglogoms)
  28. imglogoms = cv2.bitwise_not(imglogoms)
  29. #cv2.imshow('imglogoms',imglogoms)
  30. #cv2.imshow('imglogotr0',imglogotr)
  31. imgcattr = imgcat[0+130:160+130, 0+170:160+170]
  32. imgcatzero = np.zeros((width,height,3),dtype=np.uint8)
  33. imgcattr = cv2.add(imgcattr,imgcatzero,mask=imglogoms)
  34. #cv2.imshow('imgcattr',imgcattr)
  35. #cv2.imshow('imgcatzero',imgcatzero)
  36. #查找轮廓,绘制,计算面积,周长
  37. contours, hierarchy = cv2.findContours(moon_b, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)
  38. cir = cv2.drawContours(moon_cut, contours,1, (0, 0, 255), 2)
  39. area = cv2.contourArea(contours[1])
  40. primeter = cv2.arcLength(contours[1], closed=True)
  41. cv2.imshow('cir', cir)
  42. #把计算结果写道图片上
  43. cv2.putText(imgcat,'moon area: 20065.5',(30,30), cv2.FONT_HERSHEY_COMPLEX_SMALL,1,[0,255,0])
  44. cv2.putText(imgcat,'moon primeter: 530.114785',(30,50), cv2.FONT_HERSHEY_COMPLEX_SMALL,1,[0,255,0])
  45. print ('area',primeter)
  46. imgadd = cv2.add(imgcattr,imglogotr)
  47. imgcat[0+130:160+130, 0+170:160+170] = imgadd
  48. cv2.imshow('final',imgcat)
  49. cv2.waitKey(0)
  50. cv2.destroyAllWindows()

 

 

三.总结

四.系列文章,其他模块可直接参考开头的链接目录

声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号