{"id":9073,"date":"2024-01-03T15:39:39","date_gmt":"2024-01-03T07:39:39","guid":{"rendered":"\/?p=9073"},"modified":"2024-01-03T15:39:39","modified_gmt":"2024-01-03T07:39:39","slug":"opencv-%e7%9b%b4%e6%96%b9%e5%9b%be%e4%b8%8e%e6%a8%a1%e6%9d%bf%e5%8c%b9%e9%85%8d","status":"publish","type":"post","link":"\/?p=9073","title":{"rendered":"OpenCV-\u76f4\u65b9\u56fe\u4e0e\u6a21\u677f\u5339\u914d"},"content":{"rendered":"<pre><code class=\"language-python\">import cv2 #opencv\u8bfb\u53d6\u7684\u683c\u5f0f\u662fBGR\nimport numpy as np\nimport matplotlib.pyplot as plt#Matplotlib\u662fRGB\n%matplotlib inline <\/code><\/pre>\n<pre><code class=\"language-python\">def cv_show(img,name):\n    cv2.imshow(name,img)\n    cv2.waitKey()\n    cv2.destroyAllWindows()<\/code><\/pre>\n<h3>\u76f4\u65b9\u56fe<\/h3>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/hist_1.png\" alt=\"title\" \/><\/p>\n<h4>cv2.calcHist(images,channels,mask,histSize,ranges)<\/h4>\n<ul>\n<li>images: \u539f\u56fe\u50cf\u56fe\u50cf\u683c\u5f0f\u4e3a uint8 \u6216 \ufb02oat32\u3002\u5f53\u4f20\u5165\u51fd\u6570\u65f6\u5e94 \u7528\u4e2d\u62ec\u53f7 [] \u62ec\u6765\u4f8b\u5982[img]<\/li>\n<li>channels: \u540c\u6837\u7528\u4e2d\u62ec\u53f7\u62ec\u6765\u5b83\u4f1a\u544a\u51fd\u6570\u6211\u4eec\u7edf\u5e45\u56fe \u50cf\u7684\u76f4\u65b9\u56fe\u3002\u5982\u679c\u5165\u56fe\u50cf\u662f\u7070\u5ea6\u56fe\u5b83\u7684\u503c\u5c31\u662f [0]\u5982\u679c\u662f\u5f69\u8272\u56fe\u50cf \u7684\u4f20\u5165\u7684\u53c2\u6570\u53ef\u4ee5\u662f [0][1][2] \u5b83\u4eec\u5206\u522b\u5bf9\u5e94\u7740 BGR\u3002 <\/li>\n<li>mask: \u63a9\u6a21\u56fe\u50cf\u3002\u7edf\u6574\u5e45\u56fe\u50cf\u7684\u76f4\u65b9\u56fe\u5c31\u628a\u5b83\u4e3a None\u3002\u4f46\u662f\u5982 \u679c\u4f60\u60f3\u7edf\u56fe\u50cf\u67d0\u4e00\u5206\u7684\u76f4\u65b9\u56fe\u7684\u4f60\u5c31\u5236\u4f5c\u4e00\u4e2a\u63a9\u6a21\u56fe\u50cf\u5e76 \u4f7f\u7528\u5b83\u3002<\/li>\n<li>histSize:BIN \u7684\u6570\u76ee\u3002\u4e5f\u5e94\u7528\u4e2d\u62ec\u53f7\u62ec\u6765<\/li>\n<li>ranges: \u50cf\u7d20\u503c\u8303\u56f4\u5e38\u4e3a [0256] <\/li>\n<\/ul>\n<pre><code class=\"language-python\">img = cv2.imread(&#039;cat.jpg&#039;,0) #0\u8868\u793a\u7070\u5ea6\u56fe\nhist = cv2.calcHist([img],[0],None,[256],[0,256])\nhist.shape<\/code><\/pre>\n<pre><code>(256, 1)<\/code><\/pre>\n<pre><code class=\"language-python\">plt.hist(img.ravel(),256); \nplt.show()<\/code><\/pre>\n<p>\u200b<br \/>\n<img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_6_0.png\" alt=\"png\" \/><br \/>\n\u200b    <\/p>\n<pre><code class=\"language-python\">img = cv2.imread(&#039;cat.jpg&#039;) \ncolor = (&#039;b&#039;,&#039;g&#039;,&#039;r&#039;)\nfor i,col in enumerate(color): \n    histr = cv2.calcHist([img],[i],None,[256],[0,256]) \n    plt.plot(histr,color = col) \n    plt.xlim([0,256]) \n<\/code><\/pre>\n<p>\u200b<br \/>\n<img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_7_0.png\" alt=\"png\" \/><br \/>\n\u200b    <\/p>\n<p>mask\u64cd\u4f5c<\/p>\n<pre><code class=\"language-python\"># \u521b\u5efamast\nmask = np.zeros(img.shape[:2], np.uint8)\nprint (mask.shape)\nmask[100:300, 100:400] = 255\ncv_show(mask,&#039;mask&#039;)<\/code><\/pre>\n<pre><code>(414, 500)<\/code><\/pre>\n<pre><code class=\"language-python\">img = cv2.imread(&#039;cat.jpg&#039;, 0)\ncv_show(img,&#039;img&#039;)<\/code><\/pre>\n<pre><code class=\"language-python\">masked_img = cv2.bitwise_and(img, img, mask=mask)#\u4e0e\u64cd\u4f5c\ncv_show(masked_img,&#039;masked_img&#039;)<\/code><\/pre>\n<pre><code class=\"language-python\">hist_full = cv2.calcHist([img], [0], None, [256], [0, 256])\nhist_mask = cv2.calcHist([img], [0], mask, [256], [0, 256])<\/code><\/pre>\n<pre><code class=\"language-python\">plt.subplot(221), plt.imshow(img, &#039;gray&#039;)\nplt.subplot(222), plt.imshow(mask, &#039;gray&#039;)\nplt.subplot(223), plt.imshow(masked_img, &#039;gray&#039;)\nplt.subplot(224), plt.plot(hist_full), plt.plot(hist_mask)\nplt.xlim([0, 256])\nplt.show()<\/code><\/pre>\n<p>\u200b<br \/>\n<img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_13_0.png\" alt=\"png\" \/><br \/>\n\u200b    <\/p>\n<h4>\u76f4\u65b9\u56fe\u5747\u8861\u5316<\/h4>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/hist_2.png\" alt=\"title\" \/><\/p>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/hist_3.png\" alt=\"title\" \/><\/p>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/hist_4.png\" alt=\"title\" \/><\/p>\n<pre><code class=\"language-python\">img = cv2.imread(&#039;clahe.jpg&#039;,0) #0\u8868\u793a\u7070\u5ea6\u56fe #clahe\nplt.hist(img.ravel(),256); \nplt.show()<\/code><\/pre>\n<p>\u200b<br \/>\n<img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_18_0.png\" alt=\"png\" \/><br \/>\n\u200b    <\/p>\n<pre><code class=\"language-python\">equ = cv2.equalizeHist(img) \nplt.hist(equ.ravel(),256)\nplt.show()\n<\/code><\/pre>\n<p>\u200b<br \/>\n<img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_19_0.png\" alt=\"png\" \/><br \/>\n\u200b    <\/p>\n<pre><code class=\"language-python\">res = np.hstack((img,equ))\ncv_show(res,&#039;res&#039;)<\/code><\/pre>\n<h4>\u81ea\u9002\u5e94\u76f4\u65b9\u56fe\u5747\u8861\u5316<\/h4>\n<pre><code class=\"language-python\">clahe = cv2.createCLAHE(clipLimit=2.0, tileGridSize=(8,8)) <\/code><\/pre>\n<pre><code class=\"language-python\">res_clahe = clahe.apply(img)\nres = np.hstack((img,equ,res_clahe))\ncv_show(res,&#039;res&#039;)<\/code><\/pre>\n<h3>\u6a21\u677f\u5339\u914d<\/h3>\n<p>\u6a21\u677f\u5339\u914d\u548c\u5377\u79ef\u539f\u7406\u5f88\u50cf\uff0c\u6a21\u677f\u5728\u539f\u56fe\u50cf\u4e0a\u4ece\u539f\u70b9\u5f00\u59cb\u6ed1\u52a8\uff0c\u8ba1\u7b97\u6a21\u677f\u4e0e\uff08\u56fe\u50cf\u88ab\u6a21\u677f\u8986\u76d6\u7684\u5730\u65b9\uff09\u7684\u5dee\u522b\u7a0b\u5ea6\uff0c\u8fd9\u4e2a\u5dee\u522b\u7a0b\u5ea6\u7684\u8ba1\u7b97\u65b9\u6cd5\u5728opencv\u91cc\u67096\u79cd\uff0c\u7136\u540e\u5c06\u6bcf\u6b21\u8ba1\u7b97\u7684\u7ed3\u679c\u653e\u5165\u4e00\u4e2a\u77e9\u9635\u91cc\uff0c\u4f5c\u4e3a\u7ed3\u679c\u8f93\u51fa\u3002\u5047\u5982\u539f\u56fe\u5f62\u662fAxB\u5927\u5c0f\uff0c\u800c\u6a21\u677f\u662faxb\u5927\u5c0f\uff0c\u5219\u8f93\u51fa\u7ed3\u679c\u7684\u77e9\u9635\u662f(A-a+1)x(B-b+1)<\/p>\n<pre><code class=\"language-python\"># \u6a21\u677f\u5339\u914d\nimg = cv2.imread(&#039;lena.jpg&#039;, 0)\ntemplate = cv2.imread(&#039;face.jpg&#039;, 0)\nh, w = template.shape[:2] <\/code><\/pre>\n<pre><code class=\"language-python\">img.shape<\/code><\/pre>\n<pre><code>(263, 263)<\/code><\/pre>\n<pre><code class=\"language-python\">template.shape<\/code><\/pre>\n<pre><code>(110, 85)<\/code><\/pre>\n<ul>\n<li>TM_SQDIFF\uff1a\u8ba1\u7b97\u5e73\u65b9\u4e0d\u540c\uff0c\u8ba1\u7b97\u51fa\u6765\u7684\u503c\u8d8a\u5c0f\uff0c\u8d8a\u76f8\u5173        <\/li>\n<li>TM_CCORR\uff1a\u8ba1\u7b97\u76f8\u5173\u6027\uff0c\u8ba1\u7b97\u51fa\u6765\u7684\u503c\u8d8a\u5927\uff0c\u8d8a\u76f8\u5173<\/li>\n<li>TM_CCOEFF\uff1a\u8ba1\u7b97\u76f8\u5173\u7cfb\u6570\uff0c\u8ba1\u7b97\u51fa\u6765\u7684\u503c\u8d8a\u5927\uff0c\u8d8a\u76f8\u5173<\/li>\n<li>TM_SQDIFF_NORMED\uff1a\u8ba1\u7b97\u5f52\u4e00\u5316\u5e73\u65b9\u4e0d\u540c\uff0c\u8ba1\u7b97\u51fa\u6765\u7684\u503c\u8d8a\u63a5\u8fd10\uff0c\u8d8a\u76f8\u5173<\/li>\n<li>TM_CCORR_NORMED\uff1a\u8ba1\u7b97\u5f52\u4e00\u5316\u76f8\u5173\u6027\uff0c\u8ba1\u7b97\u51fa\u6765\u7684\u503c\u8d8a\u63a5\u8fd11\uff0c\u8d8a\u76f8\u5173<\/li>\n<li>TM_CCOEFF_NORMED\uff1a\u8ba1\u7b97\u5f52\u4e00\u5316\u76f8\u5173\u7cfb\u6570\uff0c\u8ba1\u7b97\u51fa\u6765\u7684\u503c\u8d8a\u63a5\u8fd11\uff0c\u8d8a\u76f8\u5173<\/li>\n<\/ul>\n<p>\u516c\u5f0f\uff1a<a href=\"https:\/\/docs.opencv.org\/3.3.1\/df\/dfb\/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d\">https:\/\/docs.opencv.org\/3.3.1\/df\/dfb\/group__imgproc__object.html#ga3a7850640f1fe1f58fe91a2d7583695d<\/a><\/p>\n<pre><code class=\"language-python\">methods = [&#039;cv2.TM_CCOEFF&#039;, &#039;cv2.TM_CCOEFF_NORMED&#039;, &#039;cv2.TM_CCORR&#039;,\n           &#039;cv2.TM_CCORR_NORMED&#039;, &#039;cv2.TM_SQDIFF&#039;, &#039;cv2.TM_SQDIFF_NORMED&#039;]<\/code><\/pre>\n<pre><code class=\"language-python\">res = cv2.matchTemplate(img, template, cv2.TM_SQDIFF)\nres.shape<\/code><\/pre>\n<pre><code>(154, 179)<\/code><\/pre>\n<pre><code class=\"language-python\">min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)<\/code><\/pre>\n<pre><code class=\"language-python\">min_val<\/code><\/pre>\n<pre><code>39168.0<\/code><\/pre>\n<pre><code class=\"language-python\">max_val<\/code><\/pre>\n<pre><code>74403584.0<\/code><\/pre>\n<pre><code class=\"language-python\">min_loc<\/code><\/pre>\n<pre><code>(107, 89)<\/code><\/pre>\n<pre><code class=\"language-python\">max_loc<\/code><\/pre>\n<pre><code>(159, 62)<\/code><\/pre>\n<pre><code class=\"language-python\">for meth in methods:\n    img2 = img.copy()\n\n    # \u5339\u914d\u65b9\u6cd5\u7684\u771f\u503c\n    method = eval(meth)\n    print (method)\n    res = cv2.matchTemplate(img, template, method)\n    min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)\n\n    # \u5982\u679c\u662f\u5e73\u65b9\u5dee\u5339\u914dTM_SQDIFF\u6216\u5f52\u4e00\u5316\u5e73\u65b9\u5dee\u5339\u914dTM_SQDIFF_NORMED\uff0c\u53d6\u6700\u5c0f\u503c\n    if method in [cv2.TM_SQDIFF, cv2.TM_SQDIFF_NORMED]:\n        top_left = min_loc\n    else:\n        top_left = max_loc\n    bottom_right = (top_left[0] + w, top_left[1] + h)\n\n    # \u753b\u77e9\u5f62\n    cv2.rectangle(img2, top_left, bottom_right, 255, 2)\n\n    plt.subplot(121), plt.imshow(res, cmap=&#039;gray&#039;)\n    plt.xticks([]), plt.yticks([])  # \u9690\u85cf\u5750\u6807\u8f74\n    plt.subplot(122), plt.imshow(img2, cmap=&#039;gray&#039;)\n    plt.xticks([]), plt.yticks([])\n    plt.suptitle(meth)\n    plt.show()<\/code><\/pre>\n<pre><code>4<\/code><\/pre>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_38_1.png\" alt=\"png\" \/><\/p>\n<pre><code>5<\/code><\/pre>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_38_3.png\" alt=\"png\" \/><\/p>\n<pre><code>2<\/code><\/pre>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_38_5.png\" alt=\"png\" \/><\/p>\n<pre><code>3<\/code><\/pre>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_38_7.png\" alt=\"png\" \/><\/p>\n<pre><code>0<\/code><\/pre>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_38_9.png\" alt=\"png\" \/><\/p>\n<pre><code>1<\/code><\/pre>\n<p><img src=\"https:\/\/lemon-guess.oss-cn-hangzhou.aliyuncs.com\/img\/%E7%9B%B4%E6%96%B9%E5%9B%BE%E4%B8%8E%E6%A8%A1%E6%9D%BF%E5%8C%B9%E9%85%8D_38_11.png\" alt=\"png\" \/><\/p>\n<h3>\u5339\u914d\u591a\u4e2a\u5bf9\u8c61<\/h3>\n<pre><code class=\"language-python\">img_rgb = cv2.imread(&#039;mario.jpg&#039;)\nimg_gray = cv2.cvtColor(img_rgb, cv2.COLOR_BGR2GRAY)\ntemplate = cv2.imread(&#039;mario_coin.jpg&#039;, 0)\nh, w = template.shape[:2]\n\nres = cv2.matchTemplate(img_gray, template, cv2.TM_CCOEFF_NORMED)\nthreshold = 0.8\n# \u53d6\u5339\u914d\u7a0b\u5ea6\u5927\u4e8e%80\u7684\u5750\u6807\nloc = np.where(res &gt;= threshold)\nfor pt in zip(*loc[::-1]):  # *\u53f7\u8868\u793a\u53ef\u9009\u53c2\u6570\n    bottom_right = (pt[0] + w, pt[1] + h)\n    cv2.rectangle(img_rgb, pt, bottom_right, (0, 0, 255), 2)\n\ncv2.imshow(&#039;img_rgb&#039;, img_rgb)\ncv2.waitKey(0)<\/code><\/pre>\n<pre><code>-1<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>import cv2 #opencv\u8bfb\u53d6\u7684\u683c\u5f0f\u662fBGR import numpy as np import matplotlib.pyp   \u2026 &#8230;<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"ngg_post_thumbnail":0},"categories":[223],"tags":[],"_links":{"self":[{"href":"\/index.php?rest_route=\/wp\/v2\/posts\/9073"}],"collection":[{"href":"\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=9073"}],"version-history":[{"count":1,"href":"\/index.php?rest_route=\/wp\/v2\/posts\/9073\/revisions"}],"predecessor-version":[{"id":9075,"href":"\/index.php?rest_route=\/wp\/v2\/posts\/9073\/revisions\/9075"}],"wp:attachment":[{"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=9073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=9073"},{"taxonomy":"post_tag","embeddable":true,"href":"\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=9073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}