tag:blogger.com,1999:blog-59465307047421309702024-03-06T16:20:07.273+08:00Jax 的工作紀錄除了在整理學習上的經驗,同時也能幫助其他需要的人Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.comBlogger2125tag:blogger.com,1999:blog-5946530704742130970.post-58954299324263271512023-03-14T13:56:00.002+08:002023-03-14T13:56:51.787+08:00[OpenCV] 以最亮顏色的色相來進行灰階處理<p>OpenCV-Python 教學 <a href="https://docs.opencv.org/3.4.16/d6/d00/tutorial_py_root.html">https://docs.opencv.org/3.4.16/d6/d00/tutorial_py_root.html</a></p>
<h3>原始圖片</h3>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghjO9H0ThnJzsGcDJvPktox13Xgyrloaseuwi4jfmz2qpjwRMwuPoUhRqcDvqcigEPyALRthSaizJKJzueEjTjdKKBtbXbucthhRNH9udjaWB2rpcDAxJolHM2dTZrFoy3hzCmgRN0Fao8uSPuW4eey7Cr61fQFqzmJOUC96UwrSwpOpwr8MithdYgCA/s634/01.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEghjO9H0ThnJzsGcDJvPktox13Xgyrloaseuwi4jfmz2qpjwRMwuPoUhRqcDvqcigEPyALRthSaizJKJzueEjTjdKKBtbXbucthhRNH9udjaWB2rpcDAxJolHM2dTZrFoy3hzCmgRN0Fao8uSPuW4eey7Cr61fQFqzmJOUC96UwrSwpOpwr8MithdYgCA/s600/01.jpg"/></a>
<p>原圖因為燈光散射的關係,整個圖片都出現發紅的現象</p>
<br/>
<h3>預設灰階 <small>cv2.imread('01.jpg', cv2.IMREAD_GRAYSCALE)</small></h3>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwJbtlkUWkLWUzta_7gHauNPnqVbhx1kjc_z82lWIIKeG-EJRkXYt19ep70KpFVYfPDNkdSfWJj90Fcpyj3rsQzCIK4G2Zmw493AfeAwUtj5t3Fbrzg_Yl7API9zGWmpkBkhKWHea4GAJpO-GExykyau9hC1Ouy5bYoVZ_Mz_re1sONHS0SKuIjlsqaQ/s634/01a.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwJbtlkUWkLWUzta_7gHauNPnqVbhx1kjc_z82lWIIKeG-EJRkXYt19ep70KpFVYfPDNkdSfWJj90Fcpyj3rsQzCIK4G2Zmw493AfeAwUtj5t3Fbrzg_Yl7API9zGWmpkBkhKWHea4GAJpO-GExykyau9hC1Ouy5bYoVZ_Mz_re1sONHS0SKuIjlsqaQ/s600/01a.jpg"/></a>
<p>有部分的色差變得不明顯,之後要進行辨識變得很困難</p>
<br/>
<h3>色相比例的灰階</h3>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSfxLWaMSBFci_crNibMSV6s5AWKCFdofk0CpvKIG1gmMoue8DF6QbU7NcpSsKEgZoKT1knYp4HVIKjftdV7MgmS-jpbSgzsVCE_VG-ssddKFr2fZw9mcSo1dmsjv2MJWDXj80FE-0mV35B-fhyXG_MQQEokb9vQswTGaIkm1Hjfn7J-UtbRviX2ihWA/s634/01b.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiSfxLWaMSBFci_crNibMSV6s5AWKCFdofk0CpvKIG1gmMoue8DF6QbU7NcpSsKEgZoKT1knYp4HVIKjftdV7MgmS-jpbSgzsVCE_VG-ssddKFr2fZw9mcSo1dmsjv2MJWDXj80FE-0mV35B-fhyXG_MQQEokb9vQswTGaIkm1Hjfn7J-UtbRviX2ihWA/s600/01b.jpg"/></a>
<p>透過色相的方式就好很多</p>
<br/>
<h3>HSV 的數值定義</h3>
<ul>
<li>H: 色相 0~360度</li>
<li>S: 飽和度 0~1</li>
<li>V: 明度 (黑)0~1(白)</li>
</ul>
<h3>OpenCV HSV 的數值定義</h3>
<ul>
<li>H: 0 ~ 180 => H / 2</li>
<li>S: 0 ~ 255 => S * 255</li>
<li>V: 0 ~ 255 => V * 255</li>
</ul>
<p>相依套件:</p>
<pre class="sh:nogutter:nocontrols" name="code">
pip install opencv-python
pip install py-linq # https://viralogic.github.io/py-enumerable/
</pre>
<p>程式:</p>
<pre class="py" name="code">
from py_linq import Enumerable
import cv2
import numpy as np
def get_hue(img):
''' 圖片色相 '''
img = cv2.resize(img, (32, 32), interpolation = cv2.INTER_LINEAR)
img_hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
pixel_hsv = np.reshape(img_hsv,(-1,3))
result = Enumerable(pixel_hsv)\
.order_by_descending(lambda p: p[2])\
.then_by_descending(lambda p: p[1])\
.first()
print(f'[result]: {result}')
return result[0]
def get_gray_rate(hue):
''' 根據色相計算灰階比例 '''
hue_full = np.uint8([[[hue,255,255]]])
hue_bgr = cv2.cvtColor(hue_full, cv2.COLOR_HSV2BGR)
(hue_b, hue_g, hue_r) = hue_bgr[0,0]
hue_total = 0.0 + hue_b + hue_g + hue_r
return [
hue_b / hue_total,
hue_g / hue_total,
hue_r / hue_total,
]
img = cv2.imread('01.jpg')
hue = get_hue(img)
gray_rate = get_gray_rate(hue) # 灰階比例
print(f'hue:{hue}, gray_rate: {gray_rate}')
# 灰階轉換
img_gray = cv2.transform(img, np.array([gray_rate]))
cv2.imshow("img", img)
cv2.imshow("img_gray", img_gray)
cv2.waitKey(0)
cv2.destroyAllWindows()
</pre>Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0tag:blogger.com,1999:blog-5946530704742130970.post-13600331491016190452022-09-05T11:29:00.000+08:002022-09-05T11:29:09.331+08:00[轉載] opencv js getPerspectiveTransform,perspectiveTransform 方法使用轉載自: <a href="https://blog.csdn.net/qq_45062700/article/details/121968913" target="_blank">opencvjs getPerspectiveTransform,perspectiveTransform方法使用</a>
<p>OpenCV JavaScript版本,使用getPerspectiveTransform,PerspectiveTransform方法。</p>
<p>JavaScript和python版本不同的是Mat的创建方法不同,python会在内部自动把数据转换成Mat类,也JavaScript不会,所以刚开始没有找到JavaScript创建Mat方法,走了很多弯路。</p>
<p>这只是测试代码,没有使用项目中真实的数据,所有有一定的偏差。</p>
<p>如果有什么错误,欢迎纠正。</p>
<p>下面上代码:</p>
<pre class="xml" name="code">
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Hello OpenCV.js</title>
</head>
<body>
<h2>Hello OpenCV.js</h2>
<h2>getPerspectiveTransform,PerspectiveTransform方法使用</h2>
<p id="status">OpenCV.js is loading...</p>
<div>
<button onClick="myclick()">输出结果</button>
</div>
<script type="text/javascript">
function myclick() {
//代码 getPerspectiveTransform
//创建数据
let srcTri = cv.matFromArray(4, 1, cv.CV_32FC2, [56, 65, 368, 52, 28, 387, 389, 390]);
let dstTri = cv.matFromArray(4, 1, cv.CV_32FC2, [0, 0, 300, 0, 0, 300, 300, 300]);
//转换的数据
let M = cv.getPerspectiveTransform(srcTri, dstTri);
console.log("getPerspectiveTransform M", M);
//==== PerspectiveTransform ======
//point点的数据一定要是一维的,opencv会自己去处理
let points = [
1, 2,
3, 4,
5, 6,
7, 8
];
//原数据
points = cv.matFromArray(4,1,cv.CV_32FC2,points);
//转换后的数据
let points_trans = new cv.Mat();
cv.perspectiveTransform(points, points_trans,M);
console.log("points", points);
console.log("points_trans", points_trans);
}
function onOpenCvReady() {
document.getElementById('status').innerHTML = 'OpenCV.js is ready.';
}
</script>
<script async src="https://docs.opencv.org/4.x/opencv.js" onload="onOpenCvReady();" type="text/javascript"></script>
<script src="https://docs.opencv.org/4.x/utils.js" type="text/javascript"></script>
</body>
</html>
</pre>
<p>getPerspectiveTransform结果</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYc1sL1bpnMBw9e6LeqMSuj99cRUCbdVglyqZT0ZV5lpk7_869pUwQld0JFDlKoDVWSTyy4-BSibSC4nUuwbaitKQ8TdNoSsarAK_LlpvFkyP6wTOzW3TtchA6vW2gWROJl7IWjwyq3mEm9-KxC8c3VZXqqNKu1WFrQRnqF7tCBKjSleawWFxjPbvAkg/s944/10a9bc90a9a545dc981bb237618c17c5.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjYc1sL1bpnMBw9e6LeqMSuj99cRUCbdVglyqZT0ZV5lpk7_869pUwQld0JFDlKoDVWSTyy4-BSibSC4nUuwbaitKQ8TdNoSsarAK_LlpvFkyP6wTOzW3TtchA6vW2gWROJl7IWjwyq3mEm9-KxC8c3VZXqqNKu1WFrQRnqF7tCBKjSleawWFxjPbvAkg/s600/10a9bc90a9a545dc981bb237618c17c5.jpg"/></a>
<p>perspectiveTransform结果</p>
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaDylEsRU5YPijz7zQjw-pv6R8WAHjOO9PckjNPO-8Pcoz82dPyy_hvWtDU5FL6h45sVBv3C6J_-OlW2_zxr1s5YGnKfZtmv054EirLUT1cxi0VayLSM3OD2nnH-HJe8kbX8RYlijCBh_66Zy7V7Vrit7V27FOzxaw-Vd8XCGMJ_xWMHsBIK0eqgEp6g/s962/a442d80f5cc840b1aa08ce27a4950dba.jpg"><img src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjaDylEsRU5YPijz7zQjw-pv6R8WAHjOO9PckjNPO-8Pcoz82dPyy_hvWtDU5FL6h45sVBv3C6J_-OlW2_zxr1s5YGnKfZtmv054EirLUT1cxi0VayLSM3OD2nnH-HJe8kbX8RYlijCBh_66Zy7V7Vrit7V27FOzxaw-Vd8XCGMJ_xWMHsBIK0eqgEp6g/s600/a442d80f5cc840b1aa08ce27a4950dba.jpg"/></a>
Jax Huhttp://www.blogger.com/profile/01953021685585893658noreply@blogger.com0